Linux マルチスレッド プログラミングを実装する方法
はじめに
条件変数は、同期のためにスレッド間で共有されるグローバル変数を使用するメカニズムです。これには主に 2 つのアクションが含まれます: スレッドは条件変数の条件が確立されるのを待ってハングアップします (CPU を占有しなくなります)。この時点では); 別のスレッドが条件を true にします (条件が true であるというシグナルを送ります)。競合を防ぐために、条件変数の使用は常にミューテックス ロックと組み合わせて行われます。
関数プロトタイプ
1. 条件変数の定義
#include <pthread.h> /* 定义两个条件变量 */ pthread_cond_t cond_pro, cond_con;
2. 条件変数の初期化と破棄
#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond); /* 初始化条件变量 */ pthread_cond_init(&cond_pro, null); pthread_cond_init(&cond_con, null); /* 销毁条件变量 */ pthread_cond_destroy(&cond_pro); pthread_cond_destroy(&cond_pro);
3. 条件の待機と起動
#include <pthread.h> int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond); /* 等待条件 */ /* 注意:pthread_cond_wait为阻塞函数。解开锁,再等待。等条件满足时,需要抢到锁,才可以被唤醒*/ pthread_cond_wait(&cond_pro,&mutex); /* 激发条件 */ /* 所有因为不满足条件的线程都会阻塞在条件变量cond_pro中的一个队列中 */ /* 以广播方式,通知所有被阻塞的所有线程 */ pthread_cond_broadcast(&cond_pro); /* 以signal方式,只通知排在最前面的线程 */ pthread_cond_signal(&cond_pro);
コード
/************************************************************************* > file name: my_con.c > author: krischou > mail:zhoujx0219@163.com > created time: tue 26 aug 2014 10:24:29 am cst ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #define cell 10 #define flore 0 int i = 0; /* 所有线程共享的全局变量,此处假定至多递增至10,最小减到0 */ pthread_mutex_t mutex; /* 定义互斥锁 */ pthread_cond_t cond_pro, cond_con; /* 定义两个条件变量 */ /* 生产者线程 */ void* pro_handler(void *arg) { pthread_detach(pthread_self()); /* 由系统回收线程资源,而非主线程回收资源 ,此类情况主线程是个服务器,永久不会退出 */ while(1) { pthread_mutex_lock(&mutex); while(i >= cell) { pthread_cond_wait(&cond_pro,&mutex); /* continue是轮询,此处是阻塞 */ /* 把锁放开再等 ,第一个参数是结构体指针,其中有成员存放被阻塞的函数 */ /*不占cpu*/ /* 不满足条件时才会等 ,需要别人告诉它,才能唤醒它*//* 当它返回时,锁也要回来了*/ } i++; if(i == 1) { /* 由空到不空,唤醒消费者 */ pthread_cond_signal(&cond_con); /*不会立马signal被阻塞的消费者线程,因为其还要等锁抢回来*/ } printf("add i: %d \n", i); pthread_mutex_unlock(&mutex); sleep(rand() % 5 + 1); } } /* 消费者线程 */ void* con_handler(void *arg) { pthread_detach(pthread_self()); while(1) { pthread_mutex_lock(&mutex); while(i <= flore) { pthread_cond_wait(&cond_cno,&mutex); } i--; if(i == 9) /* 由满到不满,要告诉生产者,以便将其唤醒 *//*此处,直接signal也可以,我们是为了更加精确*/ { pthread_cond_signal(&cond_pro); } printf("con i: %d \n", i); pthread_mutex_unlock(&mutex); sleep(rand() % 5 + 1); } } int main(int argc, char *argv[]) // exe +num -num { srand(getpid()); int con_cnt, pro_cnt; pro_cnt = atoi(argv[1]); con_cnt = atoi(argv[2]); pthread_mutex_init(&mutex,null); pthread_cond_init(&cond_pro,null); pthread_cond_init(&cond_con,null); pthread_t *arr = (pthread_t*)calloc(con_cnt + pro_cnt , sizeof(pthread_t)); int index = 0; while(pro_cnt > 0) { pthread_create(arr + index, null, pro_handler, null); index++; pro_cnt--; } while(con_cnt > 0) { pthread_create(arr + index, null, con_handler, null); index++; con_cnt--; } while(1); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond_pro); pthread_cond_destroy(&cond_con); return 0; }
Note
プロデューサ スレッドかコンシューマ スレッドか。黄色の判定条件はwhileを使用する必要があります。プロデューサスレッドを例に挙げると、i>=cell の場合、つまり i がフルの場合、この時点で pthread_cond_wait(&cond_cno,&mutex); が実行され、プロデューサスレッドは一時停止されます。コンシューマ スレッド pthread_cond_signal(&cond_pro); が起動するまで待つ必要があります。しかし、コンシューマがそれを通知するだけでは十分ではないため、一時停止されたプロデューサ スレッドは、アクティブ化する前に再度ロックを取得する必要があります。ただし、プロデューサーはコンシューマーから信号が送られたときにすぐにロックを取得できないため、この時点で i 値が 10 以上に変更される可能性があります。したがって、while を使用する必要があります。それ以外の場合は、i>10 となる可能性があります。
以上がLinux マルチスレッド プログラミングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

VSコードワンステップ/次のステップショートカットキー使用法:ワンステップ(後方):Windows/Linux:Ctrl←; macOS:CMD←次のステップ(フォワード):Windows/Linux:Ctrl→; macOS:CMD→

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

Sublimeでコードを実行するには6つの方法があります。ホットキー、メニュー、ビルドシステム、コマンドライン、デフォルトビルドシステムの設定、カスタムビルドコマンド、プロジェクト/ファイルを右クリックして個々のファイル/プロジェクトを実行します。ビルドシステムの可用性は、崇高なテキストのインストールに依存します。

Linuxの主な用途には、1。Serverオペレーティングシステム、2。EmbeddedSystem、3。Desktopオペレーティングシステム、4。開発およびテスト環境。 Linuxはこれらの分野で優れており、安定性、セキュリティ、効率的な開発ツールを提供します。

GITソフトウェアのインストールには、次の手順が含まれています。インストールパッケージをダウンロードしてインストールパッケージを実行して、インストール構成gitインストールgitバッシュ(Windowsのみ)を確認します

Laravelをインストールするには、これらの手順を順番に進みます。コンポーザー(MacOS/LinuxとWindows用)インストールLaravelインストーラーをインストールします。
