线程同步有关问题求帮
线程同步问题求帮
#include <Windows.h>
#include <stdio.h>
#define NUMTHREADS 3
#define BUFFER_SIZE 16
#define FOR_TIMES 5
HANDLE hEvent;
WCHAR lpSharedBuffer[16] = {0};
void UseEvents(void);
DWORD WINAPI EventFunction(LPVOID lpParam);
int main()
{
UseEvents();
return 0;
}
void UseEvents()
{
HANDLE hThread;
hEvent = CreateEvent(
NULL,
TRUE,
FALSE,
NULL);
if (hEvent == NULL)
{
printf ("CreateEvent failed (%d)\n", GetLastError());
return;
}
hThread = CreateThread (NULL, 0,
EventFunction,
NULL,
0,NULL);
if (hThread == NULL)
{
printf ("CreateThread failed (%d)\n", GetLastError());
return;
}
Sleep(2000);
CopyMemory (lpSharedBuffer, TEXT("Event"), 2*lstrlen(TEXT("EVENT")));
SetEvent(hEvent);
}
DWORD WINAPI EventFunction(LPVOID lpParam)
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(
hEvent,
INFINITE);
if (dwWaitResult != WAIT_OBJECT_0)
{
printf ("Wait error: %d\n", GetLastError());
return 0;
}
printf ("%ws\n", lpSharedBuffer);
if (!ResetEvent (hEvent))
{
printf ("SetEvent failed (%d)\n", GetLastError());
return 0;
}
return 1;
}
为什么调试后,有时可以用,有时不可以。这是为什么?
------解决方案--------------------
那你开两个线程,一个线程等待,一个线程触发事件看看.也可以单步调试一下,但是线程同步单步调试可能与预期不一样
------解决方案--------------------
在UseEvents函数里最后(SetEvent(hEvent);后面)加上
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread); // 这句是释放,同理hEvent也要释放的,别马虎
或者
int main()
{
UseEvents();
getch(); // 先不要让主线程在子线程前退出
return 0;
}
------解决方案--------------------
你主线程最好也弄个Event等待下,不然有可能主线程跑的快SetEvent(hEvent)结束后就结束,然后把子线程回收了。
------解决方案--------------------
楼主可以参考下《秒杀多线程面试题系列》专栏,有十多篇文章。
http://blog.****.net/column/details/killthreadseries.html
#include <Windows.h>
#include <stdio.h>
#define NUMTHREADS 3
#define BUFFER_SIZE 16
#define FOR_TIMES 5
HANDLE hEvent;
WCHAR lpSharedBuffer[16] = {0};
void UseEvents(void);
DWORD WINAPI EventFunction(LPVOID lpParam);
int main()
{
UseEvents();
return 0;
}
void UseEvents()
{
HANDLE hThread;
hEvent = CreateEvent(
NULL,
TRUE,
FALSE,
NULL);
if (hEvent == NULL)
{
printf ("CreateEvent failed (%d)\n", GetLastError());
return;
}
hThread = CreateThread (NULL, 0,
EventFunction,
NULL,
0,NULL);
if (hThread == NULL)
{
printf ("CreateThread failed (%d)\n", GetLastError());
return;
}
Sleep(2000);
CopyMemory (lpSharedBuffer, TEXT("Event"), 2*lstrlen(TEXT("EVENT")));
SetEvent(hEvent);
}
DWORD WINAPI EventFunction(LPVOID lpParam)
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(
hEvent,
INFINITE);
if (dwWaitResult != WAIT_OBJECT_0)
{
printf ("Wait error: %d\n", GetLastError());
return 0;
}
printf ("%ws\n", lpSharedBuffer);
if (!ResetEvent (hEvent))
{
printf ("SetEvent failed (%d)\n", GetLastError());
return 0;
}
return 1;
}
为什么调试后,有时可以用,有时不可以。这是为什么?
------解决方案--------------------
那你开两个线程,一个线程等待,一个线程触发事件看看.也可以单步调试一下,但是线程同步单步调试可能与预期不一样
------解决方案--------------------
在UseEvents函数里最后(SetEvent(hEvent);后面)加上
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread); // 这句是释放,同理hEvent也要释放的,别马虎
或者
int main()
{
UseEvents();
getch(); // 先不要让主线程在子线程前退出
return 0;
}
------解决方案--------------------
你主线程最好也弄个Event等待下,不然有可能主线程跑的快SetEvent(hEvent)结束后就结束,然后把子线程回收了。
------解决方案--------------------
楼主可以参考下《秒杀多线程面试题系列》专栏,有十多篇文章。
http://blog.****.net/column/details/killthreadseries.html