2013-05-03 54 views
2

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碼粗略例子中,我們可以用這個簡單的線程管理模式改寫我們的遺留代碼沒有太多的重構?

回答

1

如果它不破不解決它(特別是如果這是一箇舊的代碼庫)

  1. VS風格揮發性將圍繞多幾年。鑑於這一點,MFC不會死亡,這不會很快死掉。粗略的Google 搜索說你可以用/volatile:ms來控制它。

  2. Atomics可能會做易變的工作,特別是如果這是一個計數器 可能會有很少的性能開銷。

  3. 與C++ 11實現相比,許多Windows本機函數具有不同的性能特徵。例如,Windows TimerQueues和Multimedia具有用C++ 11無法實現的精度。

    例如::sleep_for(5) 將睡15(而不是5或6)。這可以用一個神祕的 致電timeSetPeriod來解決。另一個例子是,在條件變量上解鎖可能響應緩慢。修復這些問題的接口不會暴露給Windows上的C++ 11。

+0

謝謝 - '/ volatile:ms'是什麼引發了這個問題(我鏈接到一個早期的問題),因爲我得到的建議表明我*應該*「修復」它。我只關心下一個Visual Studio可能會破壞它,如果我們沒有使它更加合規。同樣高興地無所事事,雖然:-) – 2013-05-03 07:50:37

+0

「有精度,是不可能實現與C + + 11」 - 你能說明爲什麼這是不可能的? VS實現中的錯誤? – SChepurin 2013-05-03 07:54:50

+0

@SChepurin更新。 – Mikhail 2013-05-03 08:01:44