擬似コード:
void * thread_start(void *arg) {
while (1) {
/* for each column. Only run columns the thread_num
is assigned to */
column_count = thread_num;
for (; column_count < dim - 1; column_count+=threads) {
/* do thread work for data chunk */
}
/* barrier */
barrier_result = pthread_barrier_wait(barrier);
if (not_finished == 0) {
/* finished */
break;
/* break while loop, end thread.
The barrier is now broken because it is no longer
getting called by this thread */
}
/* we are not finished, loop around and
do thread work on next data chunk */
}
}
バリアに関する私の問題は、他のスレッドの前に終了するスレッドをどのように処理するかです。
バリアとは、すべてのスレッドが他のすべてのスレッドを待たなければならないことを意味します。
すべてのスレッドが同時に終了することを保証するための手法は何ですか?
ループを続けようとしましたが、「スレッド作業」を無視しましたが、この場合、8 つのスレッドすべてが終了し、スレッドに「すべて完了しました。今すぐ終了できます」と伝える賢明な方法はありません。
編集:
アルゴリズム:
- データのセグメントに対して操作を実行する
- スレッドのデータのセグメントが終了した場合は終了します。
- バリア待ち。
- 1 つのスレッドがデータの一部を新しいデータに置き換えます
- 1を繰り返します。
編集2:
バリアを 1 サイズ小さいバリアで上書きするエレガントな方法はありますか? (バリアの周りにミューテックスを配置せずに)