假設我有一個程序,通過線程初始化的全局變量的使用,如下所示:安全傳遞只讀數據到一個新的線程
int ThreadParameter;
// this function runs from the main thread
void SomeFunction() {
ThreadParameter = 5;
StartThread(); // some function to start a thread
// at this point, ThreadParameter is NEVER modified.
}
// this function is run in a background worker thread created by StartThread();
void WorkerThread() {
PrintValue(ThreadParameter); // we expect this to print "5"
}
這些問題應該適用於任何通用處理器架構,一個可能會遇到。我希望解決方案是可移植的,而不是針對具有更強內存保證的體系結構,比如x86。
- 一般問題:儘管很普遍,但在所有處理器架構中這是否真的很安全?如何使它安全,如果不是?
- 全局變量不是
volatile
;是否可能會在StartThread()
電話後重新排序並讓我清洗?如何解決這個問題? - 假設計算機有兩個有自己的緩存的處理器。主線程在第一個處理器上運行,工作線程在第二個處理器上運行假設包含
ThreadParameter
的內存塊在程序開始運行之前已被分頁到每個處理器的緩存中SomeFunction()
。SomeFunction()
寫入5
到ThreadParameter
,它存儲在第一個處理器的緩存中,然後啓動工作線程,該線程在第二個處理器上運行。第二個處理器上的WorkerThread()
將不會看到ThreadParameter
的未初始化數據,而不是5
的預期值,因爲第二個處理器中的內存頁尚未看到來自第一個處理器的更新? - 如果需要不同的東西 - 如何處理這個問題,而不是簡單的
int
,我可以使用一個指向更復雜的數據類型的指針,這些數據類型不一定用於多線程環境?
如果我的擔憂是沒有根據的,那麼我爲什麼不需要擔心的具體原因是什麼?
我假設SomeFunction會調用多個WorkerThreads。我認爲你的問題更像是:「同時讀會導致我一個問題?」 ....? – Alex 2012-03-21 20:51:36
那麼,使用POSIX線程時,你可以使用['pthread_once()'](http://linux.die.net/man/3/pthread_once)解決全局變量初始化難題 - 我不確定這是怎麼翻譯的到你的「便攜式」的定義。 – 2012-03-21 20:55:01
我想最好的解決方案是'boost:shared_mutex'並將只讀文件複製到每個線程中。 – Pubby 2012-03-21 21:02:15