[英]thread safe data exchange between threads/shared memory in C++ on linux
[英]Data exchange between threads
我嘗試編寫一個用於物理模擬的程序。 我使用兩個線程,一個用於計算,一個用於gui。 為了在它們之間交換數據,我使用了一個結構
struct sim_data {
int running;
int steps;
int progress;
...
};
並將其包含在不同的線程中
void *sim(void *args) {
struct sim_data *my_data;
my_data=(struct sim_data *)args;
...
}
設定值時
my_data->progress=1000;
數據在同一線程中可用,但在第二個線程中不可靠。 當啟動程序在第二個線程中讀取一個不同的值然后在第一個線程中寫入一個值時,我猜想有10%的機會。 雖然數據是循環寫入的,但我認為這不是時序問題。
我覺得這很奇怪。 你猜怎么了?
C ++ 11規范將數據爭用情況聲明為一個線程寫入某個位置而第二個線程可以讀取或寫入同一位置的任何時間。 它聲明您在發生這種情況時得到未定義的行為。 在您的情況下,一個線程正在寫入my_data-> progress,而另一個正在讀取它。
解決方案是使用同步,例如原子整數或鎖定。
C ++編譯器做了非常出色的優化,以使您的單線程程序運行得更快。 例如,它可能證明,在單線程環境中,無法看到1000值,而只是選擇不打印它。
還有更多丑陋的案件是合法的。 如果編譯器知道您要存儲1000,則可以選擇根本不存儲任何內容,而是使用該內存作為空間將臨時結果“溢出”到其中,而不是在最終存儲1000之前分配更多的空間。同時,您可以讀取任意值。
對於該問題的幽默觀點,請訪問: http : //software.intel.com/zh-cn/blogs/2013/01/06/benign-data-races-what-could-possfully-go-wrong
最簡單的解決方案:
struct sim_data {
int running;
int steps;
atomic<int> progress; //this will guarantee the data are coherent between two threads
...
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.