2016-10-19 21 views
2

pthread_createで4つのスレッドを作成しました。私はそれらが同時に実行されるようにしたいので、私はsem_wait(&sem)をスレッドプロシージャの冒頭に追加します。メインスレッドでは、私はこのようなものを使用しても、私はそれが良い解決策だとは思わない:pthreadを使用して複数のスレッドをウェイクアップする最良の方法

for (int i = 0; i < 4; i++) 
{ 
    sem_post(&sem); 
} 

私はGoogleで検索してpthread_cond_tました。ただし、pthread_cond_broadcastは、現在待機しているスレッドのみを起動できます。私がpthread_cond_waitを手続きの冒頭に置いたとしても、(メインスレッド内)の前にpthread_cond_waitが呼び出されていることは、まだ保証されていません。

これを避けるには、waitbroadcastの呼び出しシーケンスを確実にするために、たくさんの追加コードを追加する必要があります。これはスマートではありません。

したがって、すべてのスレッドを「整列」させる簡単な方法があります(それらが同時に実行されるようにします)?

sem_post_multipleがあるようですが、pthreadではwin32拡張です。私はLinux(Android)を使用しています。

答えて

3

あなたはすべてのスレッドで)あなたがスレッドの数(N)で初期化してからpthread_barrier_wait(コールバリア

pthread_barrier_t

を探しています。この呼び出しは、n個のスレッドがバリアに到達するまで実行をブロックします。

例:

int num_threads = 4; 
pthread_barrier_t bar; 

void* thread_start(void* arg) { 
    pthread_barrier_wait(&bar); 
    //... 
} 
int main() { 
    pthread_barrier_init(&bar,NULL,num_threads); 
    pthread_t thread[num_threads]; 
    for (int i=0; i < num_threads; i++) { 
     pthread_create(thread + i, NULL, &thread_start, NULL); 
    } 
    for (int i=0; i < num_threads; i++) { 
     pthread_join(thread[i], NULL); 
    } 
    pthread_barrier_destroy(&bar); 
    return 0; 
} 
+0

ありがとうございました。それはまさに私が欲しいものです。 Android NDKはpthread_barrier_tをサポートしていませんが、次の簡略化されたバージョンに従って実装できます:[simplified pthread_barrier_t](https://chromium.googlesource.com/external/google-breakpad/src.git/+/85e1fdcdc1029741a49d91b2e03e5d14aeee2765/common/android /testing/pthread_fixes.h) –

+0

同期構造化のほとんどは他のツールで構築できますが、基本的にはmutexとcond.-variablesだけが必要です – Domso

関連する問題