HANDLE g_event = NULL;
char g_szText[256] = {0};
UINT __cdecl ThreadProc1( LPVOID pParam )
{
ResetEvent(g_event);
WaitForSingleObject(g_event, INFINITE);
strcpy(g_szText, "thread proc 1\n");
fwrite(g_szText, strlen(g_szText), 1, g_fp);
// g_event.SetEvent();
return 0;
}
UINT __cdecl ThreadProc2( LPVOID pParam )
{
ResetEvent(g_event);
WaitForSingleObject(g_event, INFINITE);
strcpy(g_szText, "thread proc 2\n");
fwrite(g_szText, strlen(g_szText), 1, g_fp);
// g_event.SetEvent();
return 0;
}
UINT __cdecl ThreadProc3( LPVOID pParam )
{
ResetEvent(g_event);
WaitForSingleObject(g_event, INFINITE);
strcpy(g_szText, "thread proc 3\n");
fwrite(g_szText, strlen(g_szText), 1, g_fp);
// g_event.SetEvent();
return 0;
}
void CThreadSychronizeEventDlg::OnOK()
{
// TODO: Add extra validation here
g_event = CreateEvent(NULL, TRUE, FALSE, NULL);
ASSERT(NULL != g_event);
g_fp = fopen("record.txt", "w");
ASSERT (NULL != g_fp);
::AfxBeginThread(ThreadProc1, NULL);
Sleep(1000);
::AfxBeginThread(ThreadProc2, NULL);
Sleep(1000);
::AfxBeginThread(ThreadProc3, NULL);
Sleep(1000);
SetEvent(g_event);
//CDialog::OnOK();
}
新建一个dlg工程,然后在onok里面创个事件对象,打开个文件,开3个线程.
我感觉应该不会有任何一个线程可以往record.txt中写内容,但是事实上是每个线程都写了,这是什么原因啊???
请大家多多指教,不胜感激.
5 个解决方案
#1
我感觉应该不会有任何一个线程可以往record.txt中写内容,但是事实上是每个线程都写了,这是什么原因啊???
=========
根据你的代码,这三个线程确实都会写文件的啊
当三个线程开启后,全阻塞在WaitForSingleObject这个地方,当OnOK执行到SetEvent(g_event)时,这三个线程会从阻塞状态转化执行状态,由于你CreateEvent(NULL, TRUE, FALSE, NULL);时第二个参数为TRUE,必须要手动复位,所以三个线程全都会被触发的。
=========
根据你的代码,这三个线程确实都会写文件的啊
当三个线程开启后,全阻塞在WaitForSingleObject这个地方,当OnOK执行到SetEvent(g_event)时,这三个线程会从阻塞状态转化执行状态,由于你CreateEvent(NULL, TRUE, FALSE, NULL);时第二个参数为TRUE,必须要手动复位,所以三个线程全都会被触发的。
#2
人工重置的事件对象不要用来同步线程
用自动重置的事件对象才能同步
用自动重置的事件对象才能同步
#3
如果要所有的线程都运行得人工重置,如果只要一个得设置为自动重置。
#4
HANDLE WINAPI CreateEvent(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTSTR lpName
);
该函数的第2个参数,你设置的为TRUE,那么你创建的是人工重置事件对象,如果该事件对象为signal,那么等待该事件对象的所有线程WaitForSingleObject函数都返回,即你所有的线程都可以往下运行,所有拟的三个线程都会去写文件。如果你设置的FALSE,那么你创建的是自动重置对象,如果该事件对象为signal,那么等待该事件对象的所有线程中的一个线程WaitForSingleObject函数都返回,即只有一个线程会往下运行,那么就只有一个线程会去写文件操作,其他两个阻塞。
When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.
When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.
具体参看MSDN
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTSTR lpName
);
该函数的第2个参数,你设置的为TRUE,那么你创建的是人工重置事件对象,如果该事件对象为signal,那么等待该事件对象的所有线程WaitForSingleObject函数都返回,即你所有的线程都可以往下运行,所有拟的三个线程都会去写文件。如果你设置的FALSE,那么你创建的是自动重置对象,如果该事件对象为signal,那么等待该事件对象的所有线程中的一个线程WaitForSingleObject函数都返回,即只有一个线程会往下运行,那么就只有一个线程会去写文件操作,其他两个阻塞。
When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.
When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.
具体参看MSDN
#5
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#1
我感觉应该不会有任何一个线程可以往record.txt中写内容,但是事实上是每个线程都写了,这是什么原因啊???
=========
根据你的代码,这三个线程确实都会写文件的啊
当三个线程开启后,全阻塞在WaitForSingleObject这个地方,当OnOK执行到SetEvent(g_event)时,这三个线程会从阻塞状态转化执行状态,由于你CreateEvent(NULL, TRUE, FALSE, NULL);时第二个参数为TRUE,必须要手动复位,所以三个线程全都会被触发的。
=========
根据你的代码,这三个线程确实都会写文件的啊
当三个线程开启后,全阻塞在WaitForSingleObject这个地方,当OnOK执行到SetEvent(g_event)时,这三个线程会从阻塞状态转化执行状态,由于你CreateEvent(NULL, TRUE, FALSE, NULL);时第二个参数为TRUE,必须要手动复位,所以三个线程全都会被触发的。
#2
人工重置的事件对象不要用来同步线程
用自动重置的事件对象才能同步
用自动重置的事件对象才能同步
#3
如果要所有的线程都运行得人工重置,如果只要一个得设置为自动重置。
#4
HANDLE WINAPI CreateEvent(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTSTR lpName
);
该函数的第2个参数,你设置的为TRUE,那么你创建的是人工重置事件对象,如果该事件对象为signal,那么等待该事件对象的所有线程WaitForSingleObject函数都返回,即你所有的线程都可以往下运行,所有拟的三个线程都会去写文件。如果你设置的FALSE,那么你创建的是自动重置对象,如果该事件对象为signal,那么等待该事件对象的所有线程中的一个线程WaitForSingleObject函数都返回,即只有一个线程会往下运行,那么就只有一个线程会去写文件操作,其他两个阻塞。
When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.
When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.
具体参看MSDN
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTSTR lpName
);
该函数的第2个参数,你设置的为TRUE,那么你创建的是人工重置事件对象,如果该事件对象为signal,那么等待该事件对象的所有线程WaitForSingleObject函数都返回,即你所有的线程都可以往下运行,所有拟的三个线程都会去写文件。如果你设置的FALSE,那么你创建的是自动重置对象,如果该事件对象为signal,那么等待该事件对象的所有线程中的一个线程WaitForSingleObject函数都返回,即只有一个线程会往下运行,那么就只有一个线程会去写文件操作,其他两个阻塞。
When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.
When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.
具体参看MSDN
#5
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法