关于windows核心编程中事件对象和线程的疑问。该如何处理
关于windows核心编程中事件对象和线程的疑问。
// Create a global handle to a manual-reset, nonsignaled event.
HANDLE g_hEvent;
int WINAPI WinMain(...)
{
//Create the manual-reset, nonsignaled event.
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
//Spawn 3 new threads.
HANDLE hThread[3];
DWORD dwThreadID;
hThread[0] = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
hThread[1] = _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadID);
hThread[2] = _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadID);
① OpenFileAndReadContentsIntoMemory(...);
//Allow all 3 threads to access the memory.
② SetEvent(g_hEvent);
...
}
③DWORD WINAPI WordCount(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
④DWORD WINAPI SpellCheck(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
⑤DWORD WINAPI GrammarCheck(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
1.在上面的1处,已经把数据读入,才在2处用SetEvent发出事件通知,为什么3,4,5线程还要用WaitForSingleObject等待数据读入.
2.这三个线程同时进入可调度状态,他们之间有没有先后顺序(那个线程先执行,那个后执行),如果他们没有先后顺序,我怎样控制他们有先后顺序地执行。
------解决方案--------------------
1。当然要等待,因为①
是在hThread[0] = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
hThread[1] = _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadID);
hThread[2] = _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadID);
之后执行的,这些线程产生之后就有可能会在①之前被调用,这时数据还没有呢?
2。同样的,这三个线程产生,实际上整个进程就含有4个线程了,这4个线程的执行顺序是完全随机的,同时也没有办法来控制它。除非用内核对象来让一些线程等待。
------解决方案--------------------
你等待的都是一个事件句柄,你可以使用多个事件句柄,在触发时按顺序就行了。
还可以用SetThreadPriority
// Create a global handle to a manual-reset, nonsignaled event.
HANDLE g_hEvent;
int WINAPI WinMain(...)
{
//Create the manual-reset, nonsignaled event.
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
//Spawn 3 new threads.
HANDLE hThread[3];
DWORD dwThreadID;
hThread[0] = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
hThread[1] = _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadID);
hThread[2] = _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadID);
① OpenFileAndReadContentsIntoMemory(...);
//Allow all 3 threads to access the memory.
② SetEvent(g_hEvent);
...
}
③DWORD WINAPI WordCount(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
④DWORD WINAPI SpellCheck(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
⑤DWORD WINAPI GrammarCheck(PVOID pvParam)
{
//Wait until the file 's data is in memory.
WaitForSingleObject(g_hEvent, INFINITE);
//Access the memory block.
...
return(0);
}
1.在上面的1处,已经把数据读入,才在2处用SetEvent发出事件通知,为什么3,4,5线程还要用WaitForSingleObject等待数据读入.
2.这三个线程同时进入可调度状态,他们之间有没有先后顺序(那个线程先执行,那个后执行),如果他们没有先后顺序,我怎样控制他们有先后顺序地执行。
------解决方案--------------------
1。当然要等待,因为①
是在hThread[0] = _beginthreadex(NULL, 0, WordCount, NULL, 0, &dwThreadID);
hThread[1] = _beginthreadex(NULL, 0, SpellCheck, NULL, 0, &dwThreadID);
hThread[2] = _beginthreadex(NULL, 0, GrammarCheck, NULL, 0, &dwThreadID);
之后执行的,这些线程产生之后就有可能会在①之前被调用,这时数据还没有呢?
2。同样的,这三个线程产生,实际上整个进程就含有4个线程了,这4个线程的执行顺序是完全随机的,同时也没有办法来控制它。除非用内核对象来让一些线程等待。
------解决方案--------------------
你等待的都是一个事件句柄,你可以使用多个事件句柄,在触发时按顺序就行了。
还可以用SetThreadPriority