[解決済み] pthread_mutex_trylock の使用方法について教えてください。
2022-02-18 19:58:46
質問
trylockを使用しています。
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self ();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
で、次にmain()。
int main ()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
ここでは、まず最初のスレッドの一部が出力され、次に残りが出力され、そしてまた最初のスレッドが出力されています。ロックは機能していません。もし私が同じものを
pthread_mutex_lock
のように、すべてのものが非常に順次に表示されます。
何がとんでもない間違いなんだ?
解決方法は?
を呼び出すのは意味がありません。
pthread_mutex_trylock()
結果をテストせずに
ミューテックスの取得に失敗した場合は、次のようにします。
ない
はクリティカルセクションに入り
ない
を後で解除します。 例えば、このように書き換えることができます(あなたも非常に混乱していることに注意してください。
fprintf()
を呼び出す必要があります)。
void *printHello(void *threadId)
{
if (pthread_mutex_trylock(&demoMutex) == 0)
{
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d\n", iterate);
}
pthread_mutex_unlock (&demoMutex);
}
pthread_exit (NULL);
}
しかし、おそらく
pthread_mutex_lock()
ではなく
pthread_mutex_trylock()
そうすれば、スレッドはミューテックスが争われたときに利用可能になるのを待つことができます。
pthread_mutex_lock()
は、ほとんどすべての場合に必要なものです。
_trylock
バリアントは特殊なケースを最適化するためだけのものです。
_trylock
が必要であることがわかると思います。
関連
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】strcmpが機能しない
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】malloc():メモリ破壊
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"