前提・実現したいこと
Cのpthreadの並列処理の以下のコードをセマフォで排他制御を行うように指示されたのですが、方法が検討ついていません。アドバイスいただけますでしょうか
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <pthread.h> 4 5int val = 0; 6int sum = 0; 7 8void do_work(int *p) 9{ 10 int i, tmp; 11 12 for (i = 0; i < 10; i++) { 13 if (val == 5) { 14 tmp = sum++; 15 printf("thread(%d): reached! sum=%d->%d\n", *p, tmp, sum); 16 val = 1; 17 } 18 else 19 val++; 20 printf("thread(%d): val=%d sum=%d\n", *p, val, sum); 21 } 22} 23 24int main() 25{ 26 pthread_t thread1, thread2; 27 int id1, id2, i; 28 29 id1 = 1, id2 = 2; 30 31 pthread_create(&thread1, 32 NULL, 33 (void *) do_work, 34 (int *) &id1); 35 36 pthread_create(&thread2, 37 NULL, 38 (void *) do_work, 39 (int *) &id2); 40 41 pthread_join(thread1, NULL); 42 pthread_join(thread2, NULL); 43 exit(0); 44}
pthreadライブラリにはセマフォを扱う関数はありません。似たような排他制御を行うものとして、ミューテックス(mutex)があります。
https://linuxjm.osdn.jp/html/glibc-linuxthreads/man3/pthread_mutex_lock.3.html
あくまでpthreadライブラリを使うのか、それともPOSIXのセマフォ関数を使うかで、コードは変わってきます。
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sem_overview.7.html
排他制御によってdata-raceを抑止する対象はどれですか?
極論すれば、一方が動いている間他方を完全に待たせてしまうのも排他です。
# 要は要件不足。なにを/どうしたいのか説明して。
セマフォはもっぱらプロセス跨いだ排他に使うもんやし。
スレッド間の排他に使うのは構わんけど、より軽いmutexで済むならmutexオススメ。