簡體   English   中英

帶屏障的 Pthread 同步

[英]Pthread synchronization with barrier

我正在嘗試同步一個與 pthread 並行化的函數。

問題是,我遇到了死鎖,因為一個線程將退出函數,而其他線程仍在等待退出的線程到達屏障。 我不確定 pthread_barrier 結構是否會處理這個問題。 下面是一個例子:

static pthread_barrier_t barrier;

static void foo(void* arg) {

  for(int i = beg; i < end; i++) {
 
    if (i > 0) {

      pthread_barrier_wait(&barrier);

    }

  }

}



int main() {

// create pthread barrier

pthread_barrier_init(&barrier, NULL, NUM_THREADS);

// create thread handles

//...

// create threads

  for (int i = 0; i < NUM_THREADS; i++) {

    pthread_create(&thread_handles[i], NULL, &foo, (void*) i);

  }

// join the threads

  for (int i = 0; i < NUM_THREADS; i++) {

    pthread_join(&thread_handles[i], NULL);

  }

}

這是我為 foo 嘗試的解決方案,但它不起作用(注意 NUM_THREADS_COPY 是 NUM_THREADS 常量的副本,並且在線程到達函數末尾時遞減):

static void foo(void* arg) {

  for(int i = beg; i < end; i++) {

    if (i > 0) {

      pthread_barrier_wait(&barrier);

    }

  }

  pthread_barrier_init(&barrier, NULL, --NUM_THREADS_COPY);

}

是否有解決方案來更新線程退出函數時在屏障中等待的線程數?

您需要決定在任何線程到達屏障之前需要多少線程才能通過屏障。 在有線程等待時重新初始化屏障會導致未定義的行為。 可能的表現包括一些等待線程被過早釋放或者一些等待線程永遠不會被釋放,但這絕不是唯一可能發生的不希望發生的事情。 任何狀況之下 ...

是否有解決方案來更新線程退出函數時在屏障中等待的線程數?

...不,pthreads 屏障不支持。

由於屏障似乎不足以滿足您的需求,您可能希望回到通用線程同步對象:條件變量(與互斥體和某種共享變量一起使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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