背景:是一个手工设置的事件对象线程A的执行函数a(int tmp) 线程B的执行函数b()
{ {
g_Var = tmp ; waitforsingleobject(事件对象)
.... //假设这里执行了10000行代码,消耗10秒的时间
setevent(事件对象) printf("%d",g_Var);
resetevent(事件对象)
} }问:在此情况下,如果线程B仍在执行那10000行的代码,还没到执行resetevent这一步的时候,线程A又开始执行了,这时候,会再次执行setevent,还是等线程B执行完resetevent后,再去执行setevent呢,它们三者之间,是否有个先后次序的规则?请指教!
{ {
g_Var = tmp ; waitforsingleobject(事件对象)
.... //假设这里执行了10000行代码,消耗10秒的时间
setevent(事件对象) printf("%d",g_Var);
resetevent(事件对象)
} }问:在此情况下,如果线程B仍在执行那10000行的代码,还没到执行resetevent这一步的时候,线程A又开始执行了,这时候,会再次执行setevent,还是等线程B执行完resetevent后,再去执行setevent呢,它们三者之间,是否有个先后次序的规则?请指教!
解决方案 »
- MFC 编辑框焦点问题
- 毕业一年忽然发现一个问题: 程序做的再牛累死累活一月撑死能挣几毛?
- 求教:自己写的类如何添加OnTimer响应函数?
- 请问richedit控件怎么使用?哪有这方面的例子啊,要求可以更改文字的颜色和大小等。
- 请大侠指教:怎样能使VC中的配置,例如工程所包含相对、绝对路径,连接库等信息,在不懂电脑中打开时相同?
- 如何在 CTabCtrl 控件上放置其他控件?
- ADO用Connection对象调用耗时很长得存储过程,中途怎样安全退出??
- ADO+sql2000问题!
- ?????关于HOOK消息的,真的没人知道吗??????
- :如何VC编程定义一个WINDOWS热键CTRL+D,实现一组WINDOWS热键CTRL+X和CTRL+V的功能?给我一段代码,谢!
- #pragma pack()之类的命令是干什么用的?
- vc如何获取当前路径?????getmodulefilename的头文件是什么啊????
waitforsingleobject(事件对象)
会再次执行setevent//执行
还是等线程B执行完resetevent后,再去执行setevent呢,//不等待
它们三者之间,是否有个先后次序的规则?因该没有,只有waitforsingleobject(事件对象),如果 事件对象有信号执行,无信号堵塞等待。
先执行A:SetEvent->WaitForSingleObject->ResetEvent->SetEvent。不知道理解的对不
这样的线程同步可以用两个手动Event(A B) A初始为Singal状态
线程A WaitForSingleObject(A) -> SetEvent(B)
B WaitForSingleObject(B) -> ReSetEvent(B) ReSetEvent(A)
参考一下这个链接
G_EVENT = CreateEvent(NULL, TRUE, FALSE, NULL);DWORD WINAPI Handle_AProc(LPVOID wParam)
{
while(A<20)
{
A = A + 1;
TRACE("A-Thread : %d\n", A);
SetEvent(G_EVENT);
Sleep(1000);
} return 0;
}DWORD WINAPI Handle_BProc(LPVOID wParam)
{
while(1)
{
WaitForSingleObject(G_EVENT, INFINITE);
Sleep(5000);
TRACE("B-Thread : %d\n",A); ResetEvent(G_EVENT);
}
return 0;
}执行结果:
A-Thread : 1
A-Thread : 2
A-Thread : 3
A-Thread : 4
A-Thread : 5
A-Thread : 6
B-Thread : 6
A-Thread : 7
A-Thread : 8
A-Thread : 9
A-Thread : 10
A-Thread : 11
B-Thread : 11
A-Thread : 12
A-Thread : 13
A-Thread : 14
A-Thread : 15
A-Thread : 16
B-Thread : 16
A-Thread : 17
A-Thread : 18
A-Thread : 19
A-Thread : 20
B-Thread : 20
实际运行不可能有你这样的结果吧,除非你运气好。我这执行的结果就是这样:a-thread:2
a-thread:3
a-thread:4
a-thread:5
ba--tthhrreeaadd::56a-thread:7
a-thread:8
a-thread:9
a-thread:10
b-tah-rteharde:a1d0:
11
a-thread:12
a-thread:13
a-thread:14
a-thread:15
b-thread:15
a-thread:16
a-thread:17
a-thread:18
a-thread:19
a-thread:20
b-thread:20