從this question下面就來控制線程一輩子,我想知道什麼是我們應該採取以取代舊代碼,我們有非常常見的模式推薦的方法。如何使用C++ 11個原子能
我們有很多,其中一個主線程spawing一個或多個後臺工作線程,並定期抽出一些工作給他們做,使用適當的同步隊列的地方。因此,對於一個工作線程的一般模式將是這樣的:
將會有一個事件HANDLE
和地方規定的bool
(通常爲成員變量) -
HANDLE hDoSomething = CreateEvent(NULL, FALSE, FALSE, NULL);
volatile bool bEndThread = false;
然後工作線程函數等待事件做功前信號,但檢查的主要環路內終止請求 -
unsigned int ThreadFunc(void *pParam)
{
// typical legacy implementation of a worker thread
while (true)
{
// wait for event
WaitForSingleObject(hDoSomething, INFINITE);
// check for termination request
if (bEndThread) break;
// ... do background work ...
}
// normal termination
return 0;
}
主線程可以再給予一些工作在後臺線程這樣的 -
// ... put some work on a synchronized queue ...
// pulse worker thread to do the work
SetEvent(hDoSomething);
它終於可以結束工作線程像這樣 -
// to terminate the worker thread
bEndThread = true;
SetEvent(hDoSomething);
// wait for worker thread to die
WaitForSingleObject(hWorkerThreadHandle, dwSomeSuitableTimeOut);
在某些情況下,我們使用兩個事件(一個用於工作,一個用於終止)和WaitForMultipleObjects
代替,但一般模式是一樣的。
所以,看替換volatile bool
用C++ 11標準等效,它是那樣簡單替換該
volatile bool bEndThread = false;
與此?
std::atomic<bool> bEndThread = false;
我確定它會工作,但它似乎不夠。另外,它不會影響我們使用兩個事件並且不會影響的情況,並且不會影響bool
。
請注意,我並不打算用PPL和/或等價物替換所有這些遺留的東西,因爲儘管我們將這些用於新開發,但遺留代碼庫已過期並且只需與最新的開發工具(我上面鏈接的原始問題顯示了我擔心的地方)。
有人可以給我的C++標準11碼粗略例子中,我們可以用這個簡單的線程管理模式改寫我們的遺留代碼沒有太多的重構?
謝謝 - '/ volatile:ms'是什麼引發了這個問題(我鏈接到一個早期的問題),因爲我得到的建議表明我*應該*「修復」它。我只關心下一個Visual Studio可能會破壞它,如果我們沒有使它更加合規。同樣高興地無所事事,雖然:-) – 2013-05-03 07:50:37
「有精度,是不可能實現與C + + 11」 - 你能說明爲什麼這是不可能的? VS實現中的錯誤? – SChepurin 2013-05-03 07:54:50
@SChepurin更新。 – Mikhail 2013-05-03 08:01:44