

以下の様なサンプルプログラム(一部省略)があります。
bossスレッドが1秒ごとにworkerスレッドを起こして、workerスレッドは処理後、再び眠ります。
worker ()
{
while (...)
{
* pthread_mutex_lock(&g_lock);
pthread_cond_wait(&g_signal, &g_lock);
* pthread_mutex_unlock(&g_lock);
:
}
}
boss()
{
while (...)
{
wait( 1 );
* pthread_mutex_lock(&g_lock);
pthread_cond_signal(&g_signal)
* pthread_mutex_unlock(&g_lock);
}
}
waitで待機し、signalで起こされるのはわかるのですが、
mutexでロックしている意味がわかりません。
mutexが不必要な処理の場合、*部分はいらないのでしょうか?
No.2ベストアンサー
- 回答日時:
> bossとworkerの同期が必要の無いシステムにおいてはmutexは不要という考えでいいのでしょうか?
workerのループ前にlockが一個必要ですが(pthread_cond_waitはunlockして待つのでその前準備として)、それ以外はたぶん不要ということでいいと思います。
たぶんと書いたのは全てのpthreadの実装で大丈夫かはわからないからです。
まあ、mutex操作の時間が惜しいほどシビアな処理でなければ、後々の処理追加の可能性や他人がそのソースを使う事も考えて、おまじない的に入れておいてもよいかと個人的には思います。
度々のご回答ありがとうございます。
実はリアルタイム処理の実装を実現するために、限界まで高速なマルチ処理を考えています。
そのため、無駄なmutexは極力避けたないという背景があります。
pthreadの内部仕様を眺めて検討したいと思います。
ありがとうございました。
No.1
- 回答日時:
結論からいうとmutexは必要です。
実は質問文のソースには潜在的なバグがあります。
pthread_cond_signal()は送信をキューイングしません。つまりその時点でwaitされてなかったら何も起こりません。
例えば、もしworker()の処理が1秒ほどかかったら、worker()がwaitする前にboss()がsignalを送ってしまうことになります。
その場合はworker()は次のsignalまでwaitしてしまうため、結果としてboss()のsignalを一回飛ばしてしまうことになります。
ですから、このへんをクリアした処理にするためには、「worker()が仕事をするべきフラグ」のような変数を導入し、boss()はsignalを送る前にそのフラグを立て、worker()はwaitに入る前にそのフラグを確認しなければなりません。
このフラグ変数は2つのスレッドから同時にアクセスされうる変数ですから、mutexで保護してやる必要があります。
これ以外にも同期をとる2つのスレッドの間ではたいてい何らかの情報共有をしているはずなので、それへアクセスするにもmutexの保護が必要です。
こういうことでmutexで保護することが一般的なのです。
ご回答ありがとうございます。
signalの動きについてわかりやすい説明で理解できました。
一般的に同期を取るにはやはり必要なんですね。
一方で、私がこれから構築しようとしているシステムもそうなんですが、
bossとworkerの同期が必要の無いシステムにおいてはmutexは不要という考えでいいのでしょうか?
つまり、bossがシグナルを発したとき、workerがビジーなら無視されても構わないシステムであり、workerの処理はworker単体で完結します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- ノートパソコン chromebookのcaps lockが外れなくなった 5 2022/07/14 19:23
- マウス・キーボード キーボードのCaps Lockキーと変換キーの挙動がおかしくなりました。 4 2022/09/04 22:44
- ダンス・バレエ ラジオ体操第1のリミックス系で、Lockダンスが踊れそうな音源ありませんか……?? 1 2023/02/05 17:25
- 英語 訳を教えてください。 4 2022/08/24 15:41
- アイドル・グラビアアイドル SnowMan 1 2022/07/16 10:45
- UNIX・Linux shellscript内のコマンドを、sudo(toor)として実行 2 2022/09/23 15:05
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- iPhone(アイフォーン) 特定の時間、特定のアプリを完全に使用禁止にするアプリ。iPhone 2 2023/04/22 04:40
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報