[英]pthreads shared memory between threads
因此,我有一小段代碼在理論上可以輕松進行解析。
結構非常簡單,非常類似於以下內容:
for (int i = 0; i < some_value; ++i) {
// we have a function called do_stuff
// somewhere in the code
// Create a new pthread
// using do_stuff as start routine
}
現在,所有變量都不在線程之間共享。 即,不需要線程之間的變量間通信。 但是我確實使用變量i
將數據寫入數組等。
我想知道的是:如果我通過了可變i
作為論據的並行線程開始常規和值i
改變(因為i
被加在一個循環周期時),做價值i
在已經存在的線程也更改?
如果將i
的地址傳遞給所有函數,並且每個函數都試圖對其進行修改,那么i
當然會搞砸了,因為它們都具有相同變量的地址。 您需要為每個線程提供需要處理的范圍,並讓它們使用局部變量對其進行迭代。 像這樣:
struct thread_data
{
int start;
int end;
pthread_t tid;
};
struct thread_data td[N]; // assuming N threads
/* divide up the ranges */
for (i = 0; i < N; ++i)
td[i] = (struct thread_data){ .start = i*len/N, .end = (i+1)*len/N };
td[N-1].end = len;
/* create the threads */
for (i = 0; i < N; ++i)
pthread_create(&td[i].tid, NULL, func, &td[i]);
並在功能上:
void *func(void *arg)
{
struct thread_data *data = arg;
for (int i = data->start; i < data->end; ++i)
/* do some work */
}
如果提供指向多個線程的指針,則它們的行為可能會以不確定的方式修改所指向的值。 如果在線程之間共享變量,則應使用信號量或互斥鎖來管理線程之間的讀/寫訪問。
如果您知道線程僅訪問不同的內存位置,則無需這樣做。 例如,如果每個線程在相同的數組中寫入但針對不同的索引,則無需保護該數組。
編輯:
如果您提供變量i
的地址,則可以,它會在線程外被循環修改。 但是,如果您在循環中創建一個臨時變量並傳遞其地址,則可以。 該示例可以幫助您了解正在發生的事情: http : //timmurphy.org/2010/05/04/pthreads-in-ca-minimal-working-example/
在C語言中,只要您提供一個指向函數的指針,它所指向的值都可以在該函數的內部和外部進行修改(無論它是否在同一線程上)。 pthread_create
要求您以void *
的形式提供啟動例程的參數,因此任何具有指向同一變量的指針的對象都可以隨時修改其值。
正如@Shahbaz所建議的那樣,您可能對OpenMP感興趣。 借助OpenMP,您可以在代碼中添加編譯指示,以便於線程創建。 您還可以指定線程是否共享變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.