質問:このような問題があります。マルチスレッド プログラムで子プロセスを作成し、 1. 最初の試みコード: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include <sys/wait.h> pthread_mutex_t ミューテックス; void* 関数(void* 引数) { pthread_mutex_lock(&mutex); printf("fun get lock\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("fun unlock\n"); } int メイン() { pthread_mutex_init(&mutex, NULL); pthread_t ID; pthread_create(&id, NULL, fun, NULL); 睡眠(1); pid_t pid = fork(); (pid == -1)の場合 { perror("フォークエラー"); -1 を返します。 } pid == 0 の場合 { pthread_mutex_lock(&mutex); printf("子がロックを取得\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("子のロック解除\n"); 終了(0); } 待機(NULL); pthread_mutex_destroy(&mutex); printf("メイン終了\n"); 0を返します。 } 推測結果:
グローバルロックを作成して初期化する メインスレッドはロックを取得するために子スレッドを作成します。メインスレッドは 1 秒間スリープし、子スレッドがロックを取得してロックします。 子スレッドは3秒間スリープし、unlock funを出力し、子スレッドは終了します。 メインスレッドがフォークを開始し、子プロセスがロックを取得し、子ロックを出力する 子プロセスのロック解除出力 子のロック解除 親プロセスのメインスレッドは子プロセスが終了するのを待ち、最後にロックを破棄してmain overを出力する。 それで…正しいコードにすぐにアクセスしましょう! ! ! 2. 合理的な分析残念ながら、答えは間違っています。 ! !
再度分析します: ブロック? ?ロックを取得するときに子プロセスがブロックされる可能性がありますか?または、親プロセスが子プロセスを待ってブロックされていますか? つまり、両方の場所がブロックされ、子プロセスはロックを取得するときにブロックされ、親プロセスがブロックされます。 検証してください! ! したがって、プログラムは 2 か所でブロックされます。子プロセスはロックを取得するときにブロックされ、その結果、親プロセスがブロックされます。 3. 問題解決
(1) pthread_join()の使用フォークする前に pthread_join() を使用します。子スレッドが終了する前にメインスレッドはブロックされ、子スレッドが終了するのを待ってからフォークします。このとき、子プロセスが取得したロックは解除されます。 コード: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include <sys/wait.h> pthread_mutex_t ミューテックス; void* 関数(void* 引数) { pthread_mutex_lock(&mutex); printf("fun get lock\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("fun unlock\n"); } int メイン() { pthread_mutex_init(&mutex, NULL); pthread_t ID; pthread_create(&id, NULL, fun, NULL); pthread_join(id, NULL); 睡眠(1); pid_t pid = fork(); (pid == -1)の場合 { perror("フォークエラー"); -1 を返します。 } pid == 0 の場合 { pthread_mutex_lock(&mutex); printf("子がロックを取得\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("子のロック解除\n"); 終了(0); } 待機(NULL); pthread_mutex_destroy(&mutex); printf("メイン終了\n"); 0を返します。 } 結果: (2)phread_atfork()を使ってフォーク前の判定を登録するヘッダーファイル: prepare: この関数はforkが実行される前に呼び出されます 親: 親プロセスはフォークが実行された後にこの関数を呼び出します child: forkが実行された後、子プロセスはこの関数を呼び出します 戻り値: 成功した場合は 0、失敗した場合はエラーコード コード: #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include <sys/wait.h> pthread_mutex_t ミューテックス; void prepare_fun(void) { pthread_mutex_lock(&mutex); } void 親関数(void) { pthread_mutex_unlock(&mutex); } void 子関数() { pthread_mutex_unlock(&mutex); } void* 関数(void* 引数) { pthread_mutex_lock(&mutex); printf("fun get lock\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("fun unlock\n"); } int メイン() { pthread_mutex_init(&mutex, NULL); pthread_t ID; pthread_atfork(準備関数、親関数、子関数); pthread_create(&id, NULL, fun, NULL); 睡眠(1); pid_t pid = fork(); (pid == -1)の場合 { perror("フォークエラー"); -1 を返します。 } pid == 0 の場合 { pthread_mutex_lock(&mutex); printf("子がロックを取得\n"); 睡眠(3); pthread_mutex_unlock(&mutex); printf("子のロック解除\n"); 終了(0); } 待機(NULL); pthread_mutex_destroy(&mutex); printf("メイン終了\n"); 0を返します。 } 結果: Linux マルチスレッドのフォークとミューテックス プロセスの例に関するこの記事はこれで終わりです。Linux マルチスレッドのフォークとミューテックスに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: JavaScript で動的な QML オブジェクトを作成する方法
目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...
解決策:クリック イベントをオーディオ コンポーネントにバインドし、再生メソッドと一時停止メソッドを...
この記事では、CSS で放射状グラデーションを使用して、次の図に示すクーポン スタイルの効果を実現す...
この記事は、IDEA で Web プロジェクトを作成し、Tomcat を構成する方法についての統合記...
区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...
この記事では、パーセンテージバーを実現するためのVueの具体的なコードを参考までに共有します。具体的...
今日は、すべてのブラウザ (主に IE 9 以上と Chrome) と互換性のある自分のホームページ...
まずは本体から始めましょう:ウェブページを閲覧するとき、最初に目に留まるのは通常、ページの背景です。...
nginx で仮想ホスト vhost を設定すると非常に便利です。 nginx設定ファイルnginx...
CDN(コンテンツ配信ネットワーク)を通じて参照できます。 jQuery は Google と Mi...
2011 年に最も顕著なウェブサイトの変更は、一連の製品に新しいユーザー インターフェースを導入した...
準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...
mysql 効率的なクエリMySQL は、左結合の速度を上げるために group by を犠牲にし...
ネットワーク データを読み込むときは、ユーザー エクスペリエンスを向上させるために、通常は円形の読み...
目次プロジェクトの背景始めるvue-cliでプロジェクトを作成するモバイル適応についてnormali...