我正在嘗試多線程同步。對於一個背景,我有一套約100000個對象 - 可能更多 - 我想以不同的方式每秒處理多次。通過事件線程同步的開銷
現在我最關心的是同步的性能。
這是我認爲應該工作得很好(我省略了所有的安全方面,因爲這只是一個測試程序,如果出現錯誤,程序將會崩潰..)。我寫了兩個funktions,第一個由程序的主線程執行,第二個由所有其他線程運行。
void SharedWorker::Start()
{
while (bRunning)
{
// Send the command to start task1
SetEvent(hTask1Event);
// Do task1 (on a subset of all objects) here
// Wait for all workers to finish task1
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfTask1WorkerEvents>, TRUE, INFINITE);
// Reset the command for task1
ResetEvent(hTask1Event);
// Send the command to start task2
SetEvent(hTask2Event);
// Do task2 (on a subset of all objects) here
// Wait for all workers to finish task2
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfTask2WorkerEvents>, TRUE, INFINITE);
// Reset the command for task2
ResetEvent(hTask2Event);
// Send the command to do cleanup
SetEvent(hCleanupEvent);
// Do some (on a subset of all objects) cleanup
// Wait for all workers to finish cleanup
WaitForMultipleObjects(<NumberOfWorkers>, <ListOfCleanupWorkerEvents>, TRUE, INFINITE);
// Reset the command for cleanup
ResetEvent(hCleanupEvent);
}
}
DWORD WINAPI WorkerThreads(LPVOID lpParameter)
{
while (bRunning)
{
WaitForSingleObject(hTask1Event, INFINITE);
// Unset finished cleanup
ResetEvent(hCleanedUp);
// Do task1 (on a subset of all objects) here
// Signal finished task1
SetEvent(hTask1);
WaitForSingleObject(hTask2Event, INFINITE);
// Reset task1 event
ResetEvent(hTask1);
// Do task2 (on a subset of all objects) here
// Signal finished task2
SetEvent(hTask2);
WaitForSingleObject(hCleanupEvent, INFINITE);
// Reset update event
ResetEvent(hTask2);
// Do cleanup (on a subset of all objects) here
// Signal finished cleanup
SetEvent(hCleanedUp);
}
return 0;
}
要指出我的要求,我只是給你一個小例子: 說我們得到了上述10萬點的對象,分成12500個對象中的每個,現代多核處理器的8子集有8個邏輯核心。相關部分是時間。所有任務必須在大約8ms內完成。
我現在的問題是,我能從分割處理中獲得顯着的提升,還是通過事件的同步過於昂貴?或者如果所有任務都需要這樣完成,甚至有另一種方法可以用更少的努力或處理時間同步線程?
這是不可能回答這個不知道更多關於你的任務,他們的資源需求(CPU,I/O)。一般來說,你應該儘量減少你的線程在等待狀態下花費的時間。異步處理是線程間信號傳遞的一種替代方法,但這在您的任務執行中可能不可行。 – 2013-03-19 13:33:13
哦,對不起,完全忘記了我的資源需求。任務1和2是純粹的CPU,清理僅用於從任務2中延遲刪除對象。不幸的是,異步處理是無法替代的任務1,任務2和清理是固定的序列,必須維持順序,並且必須完成任務可能會開始。 – rootmenu 2013-03-19 14:22:53
這聽起來像你可能能夠使用OpenMP之類的東西,而不是滾動你自己的線程/信號。這非常適合並行運行類似的順序任務。 http://msdn.microsoft.com/en-us/library/tt15eb9t(v=vs.110).aspx – 2013-03-19 14:29:29