Linuxの下で2つのスレッドを使用して協力して1つのタスクの簡単な実現を完成します
5468 ワード
以前のLinuxでのPthreadライブラリの問題を解決したばかりで、今回は2つのスレッドを使用して協力し、合計を求めるタスクを共同で完了します.
基礎を築こう
今回必要な知識は次のとおりです. lpthread、コンパイル時に使用され、宣言の効果 に相当します. pthread_mutex_tはロックオブジェクトとして 存在する. pthread_create、新しいスレッドを作成する関数呼び出し pthread_t,スレッドのタイプ コードディスプレイ
プログラム実行結果
詳細分析
次に、このコードのコアについて説明します.まず、スレッドを作成する前に行う「例外」処理は、最も重要ではありませんが、不可欠です.パラメータの判断です.
次に、スレッドを作成する4つのパラメータの具体的な意味です.それぞれ、参照するスレッドのid、属性の参照、スレッドのエントリ関数の名前、およびスレッドに転送する方法のパラメータです.ここでは参照タイプのスレッドidであることに注意してください.スレッドを作成した結果をスレッドidに返すことができることを見出します.これで修正が完了しました.
最後に,スレッドのエントリ関数で関連項目を処理した.判断スレッド、ロック、ロック解除などの操作が含まれます.両方のスレッドが完了すると、メイン関数(プロセスとみなすことができます)が起動します.最後の出力タスクを完了します!
まとめ
ええと、私がここで完成したマルチスレッドのインタラクションは、最も標準的なものではなく、「挫折」とも考えられます.しかし、主な思想は比較的正統である.実際の開発では,マルチスレッドのコラボレーションやインタラクティブなタスクをよりよく行うには,多くの面での協力が必要である.結局、この方面の知識に触れたばかりなので、コードには避けられない問題があります.博友たちの批判と指摘を歓迎して、あなたたちと一緒に進歩することを望んでいます.
基礎を築こう
今回必要な知識は次のとおりです.
#include <stdio.h>
#include <stdlib.h>
//
#include<pthread.h>
//
int sum ,count;
//
pthread_mutex_t lockid;
//
void* runner(void *param);
int main( int argc, char*argv[])
{
//
pthread_t tid , tid2;
pthread_attr_t attr;
if(argc != 2){
fprintf(stderr,"usage : a.out<integer value>
");
return -1;
}
if(atoi(argv[1])<0){
fprintf(stderr,"%d must be >= 0
",atoi(argv[1]));
return -1;
}
pthread_attr_init(&attr);
//
pthread_create(&tid,&attr,runner,argv[1]);
pthread_create(&tid2,&attr,runner,argv[1]);
// 。
pthread_join(tid,NULL);
pthread_join(tid2,NULL);
//
printf("Sum = :%d
",sum);
}
void* runner(void *param){
int i , upper = atoi(param);
pthread_mutex_lock(&lockid);
count += 1;
printf(" %d :
",count);
if(count == 1){
for(i = 1; i < upper/2 ; i++){
sum += i ;
}
}else if(count ==2 ){
for(i = upper/2; i < upper ; i++){
sum += i ;
}
}else{
printf(" , !
");
}
printf(" %d :%d\t
",count,sum);
pthread_mutex_unlock(&lockid);
pthread_exit(0);
}
プログラム実行結果
mark@mark-pc:~/Code/C/PThreadTest$ gcc main.c -lpthread -o Main
mark@mark-pc:~/Code/C/PThreadTest$ ./Main 100
1 :
1 :1225
2 :
2 :4950
Sum = :4950
詳細分析
次に、このコードのコアについて説明します.まず、スレッドを作成する前に行う「例外」処理は、最も重要ではありませんが、不可欠です.パラメータの判断です.
次に、スレッドを作成する4つのパラメータの具体的な意味です.それぞれ、参照するスレッドのid、属性の参照、スレッドのエントリ関数の名前、およびスレッドに転送する方法のパラメータです.ここでは参照タイプのスレッドidであることに注意してください.スレッドを作成した結果をスレッドidに返すことができることを見出します.これで修正が完了しました.
最後に,スレッドのエントリ関数で関連項目を処理した.判断スレッド、ロック、ロック解除などの操作が含まれます.両方のスレッドが完了すると、メイン関数(プロセスとみなすことができます)が起動します.最後の出力タスクを完了します!
まとめ
ええと、私がここで完成したマルチスレッドのインタラクションは、最も標準的なものではなく、「挫折」とも考えられます.しかし、主な思想は比較的正統である.実際の開発では,マルチスレッドのコラボレーションやインタラクティブなタスクをよりよく行うには,多くの面での協力が必要である.結局、この方面の知識に触れたばかりなので、コードには避けられない問題があります.博友たちの批判と指摘を歓迎して、あなたたちと一緒に進歩することを望んでいます.