线程同步方式
- 用户模式:WaitForMultipleObject
- 内核模式:MsgWaitForMultipleObjects
用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。
一般情况下,主线程创建子线程后(优先使用_beginthreadex),使用
WaitForSingleObject(hThread, INFINITE);等待子线程完成,但是如果子线程执行耗时操作,会导致主线程一直被等待,程序表现为卡死状态。这个时候使用内核模式的MsgWaitForMultipleObjects代替WaitForSingleObject,可防止这种情况发生!因为MsgWaitForMultipleObjects函数阻塞时仍可以响应消息!
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &monitor_thread, my_str, 0, &iThread);
if (hThread == NULL)
return -1;
while (TRUE)
{
DWORD result;
static MSG msg;
result = MsgWaitForMultipleObjects(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);
if (result == (WAIT_OBJECT_0))
break;
else
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
DispatchMessage(&msg);
}
}
PostThreadMessageW 线程间通信
windows提供了该函数以进行线程间通信数据传递;且无需绑定GUI句柄;
用户定义自定义的消息,通过该函数即可发送自定义消息;都一个参数是向需要发送消息的线程的ID,再创建线程时该值需要被获取;
unsigned iThread;
(HANDLE)_beginthreadex(NULL, 0, &monitor_thread, my_str, 0, &iThread)
#define THRD_MESSAGE_NOTIFY WM_USER+2
BOOL b_result = PostThreadMessageW(iThread, THRD_MESSAGE_NOTIFY, wParam, 0);
创建安全的多线程问题
long count=5;
HANDLE thread1[count];
//while (--count >= 0)
for(int i=0;i<count;i++)
{
long async_data=i;
thread1[i] = (HANDLE)_beginthreadex(NULL, 0, agent_fuse_async_fuse_request, (void *)async_data, 0, NULL);
//WaitForSingleObject(thread1, INFINITE); //等待函数执行完 _beginthread和_endthread
// if(thread1 != NULL)
// {
// CloseHandle(thread1);
// thread1=NULL;
// }
}
WaitForMultipleObjects(count, thread1, TRUE, INFINITE);
for(int i=0;i<count;i++)
{
CloseHandle(thread1[i]);
thread1[i]=NULL;
}