簡體   English   中英

pthreads在線程之間共享內存

[英]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 */
}

您可能還會對OpenMP感興趣,該OpenMP旨在完全自動化您的要求。

如果提供指向多個線程的指針,則它們的行為可能會以不確定的方式修改所指向的值。 如果在線程之間共享變量,則應使用信號量或互斥鎖來管理線程之間的讀/寫訪問。

如果您知道線程僅訪問不同的內存位置,則無需這樣做。 例如,如果每個線程在相同的數組中寫入但針對不同的索引,則無需保護該數組。

編輯:

如果您提供變量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM