两个进程,利用Event同步不起作用

sniper08 2012-03-15 09:51:52
一个DLL中有一份启动线程的代码,还有一个CreateEvent,OpenEvent的代码,两个进程去加载这个DLL,分别在两个进程中启动了一个线程,利用Event来保证只有一个线程执行,但是在SetEvent后,这两个线程都开始执行了。


// DLL中初始化Event的
m_hSyncEvent = OpenEvent(EVENT_ALL_ACCESS , FALSE, L"Global\\SyncEvent");
int a = GetLastError();
if (ERROR_FILE_NOT_FOUND == GetLastError())
m_hSyncEvent = CreateEvent(NULL, TRUE, TRUE, L"Global\\SyncEvent");



// DLL中的线程
SyncDll *pThis = (SyncDll *)pParam;
while(WaitForSingleObject(pThis->m_hSyncEvent, INFINITE) == WAIT_OBJECT_0)
{
ResetEvent(pThis->m_hSyncEvent);

...............
// 这里两个线程都会进


}

不知道大家明白不明白我的意思,不明白再问下,请大家帮下忙,多谢
...全文
162 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dahaii0 的回复:]

引用 9 楼 xianglitian 的回复:
跨进程最好用互斥对象

不太明白,内核对象不都能跨进程吗
[/Quote]
可以
我说最好使用互斥
dahaiI0 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]
跨进程最好用互斥对象
[/Quote]
不太明白,内核对象不都能跨进程吗
sniper08 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dulvtianya 的回复:]
引用 4 楼 sniper08 的回复:

引用 3 楼 dulvtianya 的回复:
有两种不同类型的事件对象:人工重置的事件、自动重置的事件
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent

??????……
[/Quote]
m_hSyncEvent = CreateEvent(NULL, FALSE, TRUE, L"Global\\SyncEvent");
这样就可以了,不会吧,线程中我立即调用ResetEvent(pThis->m_hSyncEvent);啦,时间这么短,两个线程就都调用了,疑惑中,请教
向立天 2012-03-16
  • 打赏
  • 举报
回复
跨进程最好用互斥对象
sniper08 2012-03-16
  • 打赏
  • 举报
回复
总结:
1、用Event,来控制两个线程,进入线程,即使立即ResetEvent,两个线程都会进,只能设置成自动重置了,即CreateEvent,第二个参数为FALSE
2、CreateEvent没有时创建,有时返回已存在的,所以只用写这个就可以了
m_hSyncEvent = CreateEvent(NULL, FALSE, TRUE, L"Global\\SyncEvent");
多谢大家。
dulvtianya 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sniper08 的回复:]

引用 3 楼 dulvtianya 的回复:
有两种不同类型的事件对象:人工重置的事件、自动重置的事件
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent

???????????????????????
你想说明……
[/Quote]
m_hSyncEvent = CreateEvent(NULL, TRUE, TRUE, L"Global\\SyncEvent");
你用的是人工重置,所以,两个进程的等待线程都会变为可调度线程,所以都执行了,你不是想问这个吗
Eleven 2012-03-15
  • 打赏
  • 举报
回复
直接CreateEvent就好了,创建命名的事件对象,如果之前有创建,则打开它
W1nds 2012-03-15
  • 打赏
  • 举报
回复
保证只有一个线程执行?
这样的话线程应该作为一个互斥资源(假设)

你的思路不对吧
你可以在Dll_process_ATTACH 中创建线程
第一个dll:

m_hSyncEvent = OpenEvent(EVENT_ALL_ACCESS , FALSE, L"Global\\SyncEvent");
int a = GetLastError();
if (ERROR_FILE_NOT_FOUND == GetLastError())
m_hSyncEvent = CreateEvent(NULL, TRUE, TRUE, L"Global\\SyncEvent");

WaitForSingleObject(m_hSyncEvent, INFINITE);
CreateThread(...);
ResetEvent(m_hSyncEvent);
第二个dll同样的代码就可以
Lactoferrin 2012-03-15
  • 打赏
  • 举报
回复
这个不应该用event,用mutex
sniper08 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dulvtianya 的回复:]
有两种不同类型的事件对象:人工重置的事件、自动重置的事件
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent
[/Quote]
???????????????????????
你想说明什么
dulvtianya 2012-03-15
  • 打赏
  • 举报
回复
有两种不同类型的事件对象:人工重置的事件、自动重置的事件
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程,要调用ResetEvent才能使事件成为未激活。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程,自动调用ResetEvent
sniper08 2012-03-15
  • 打赏
  • 举报
回复
我靠,刷新了两次,给我发了三遍帖,CSDN我服你了
  • 打赏
  • 举报
回复
怎么发了这么多

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧