#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <pthread.h>
using namespace std;
#define MAX_TD_NUM 2 //設定thread數
vector< int > all_ok_or_not;
pthread_t tid[ MAX_TD_NUM] ;
int para[ MAX_TD_NUM] ;
int check_all_ok( int * step) ;
void * thread( void * arg) ;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
int main ( ) {
int i,j;
for ( i= 0 ; i< MAX_TD_NUM; i++ ) {
all_ok_or_not.push_back ( - 1 ) ;
para[ i] = i;
}
for ( i= 0 ; i< MAX_TD_NUM; i++ )
pthread_create( & tid[ i] , NULL , thread,& para[ i] ) ;
for ( i= 0 ; i< MAX_TD_NUM; i++ )
pthread_join( tid[ i] , NULL ) ;
return 0 ;
}
void * thread( void * arg) {
int tid= * ( int * ) arg;
int step= 0 ;
while ( step< 1000 ) {
step++ ; //假設工作完成 step++
pthread_mutex_lock( & lock) ;
all_ok_or_not[ tid] = step; //把我id的那格設成0 代表我完成工作
pthread_mutex_unlock( & lock) ;
while ( check_all_ok( & step) == 0 ) { //若有thread未完成 則一直檢查
}
}
}
int check_all_ok( int * step) { //檢查是否每個thread都做完了 是回傳1 否則0
int i;
for ( i= 0 ; i< MAX_TD_NUM; i++ ) {
pthread_mutex_lock( & lock) ;
if ( * step! = all_ok_or_not[ i] ) {
pthread_mutex_unlock( & lock) ;
return 0 ;
}
pthread_mutex_unlock( & lock) ;
}
return 1 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cHRocmVhZC5oPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBNQVhfVERfTlVNIDIgLy/oqK3lrpp0aHJlYWTmlbgKIAp2ZWN0b3I8aW50PiBhbGxfb2tfb3Jfbm90OwpwdGhyZWFkX3QgdGlkW01BWF9URF9OVU1dOwppbnQgcGFyYVtNQVhfVERfTlVNXTsKIAppbnQgY2hlY2tfYWxsX29rKGludCAqc3RlcCk7CnZvaWQgKnRocmVhZCh2b2lkICphcmcpOwogCnB0aHJlYWRfbXV0ZXhfdCBsb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKcHRocmVhZF9tdXRleF90IGxvY2syID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKIAppbnQgbWFpbiAoKXsKICAgIGludCBpLGo7CiAgCiAgICBmb3IoaT0wO2k8TUFYX1REX05VTTtpKyspewogICAgICAgIGFsbF9va19vcl9ub3QucHVzaF9iYWNrKC0xKTsKICAgICAgICBwYXJhW2ldPWk7CiAgICB9CiAgICAKICAgIGZvcihpPTA7aTxNQVhfVERfTlVNO2krKykKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGlkW2ldLCBOVUxMLCB0aHJlYWQsJnBhcmFbaV0pOwogICAgCiAgICBmb3IoaT0wO2k8TUFYX1REX05VTTtpKyspCiAgICAgICAgcHRocmVhZF9qb2luKHRpZFtpXSwgTlVMTCk7CiAgICAKICAgIHJldHVybiAwOwp9CiAKdm9pZCAqdGhyZWFkKHZvaWQgKmFyZyl7CiAgICBpbnQgdGlkPSooaW50ICopYXJnOwogICAgaW50IHN0ZXA9MDsKICAgIAogICAgd2hpbGUoc3RlcDwxMDAwKXsKICAgICAgICAKICAgICAgICBzdGVwKys7IC8v5YGH6Kit5bel5L2c5a6M5oiQIHN0ZXArKwogICAgICAgIAogICAgICAgIAogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9jayk7CiAgICAgICAgYWxsX29rX29yX25vdFt0aWRdPXN0ZXA7IC8v5oqK5oiRaWTnmoTpgqPmoLzoqK3miJAwIOS7o+ihqOaIkeWujOaIkOW3peS9nAogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrKTsKICAgICAgICAKICAgICAgICB3aGlsZShjaGVja19hbGxfb2soJnN0ZXApID09IDApey8v6Iul5pyJdGhyZWFk5pyq5a6M5oiQIOWJh+S4gOebtOaqouafpQogCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgfQogICAgCiAKIAp9CiAKaW50IGNoZWNrX2FsbF9vayhpbnQgKnN0ZXApeyAvL+aqouafpeaYr+WQpuavj+WAi3RocmVhZOmDveWBmuWujOS6hiDmmK/lm57lgrMxIOWQpuWJhzAKICAgIGludCBpOwogICAgCiAgICBmb3IoaT0wO2k8TUFYX1REX05VTTtpKyspewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmKCpzdGVwIT1hbGxfb2tfb3Jfbm90W2ldKXsKICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7ICAgIAogICAgfQogICAgcmV0dXJuIDE7Cn0=
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:22: warning: unused variable ‘j’
prog.cpp: In function ‘void* thread(void*)’:
prog.cpp:61: warning: control reaches end of non-void function
/home/Hh9XzO/ccr6pITU.o: In function `main':
prog.cpp:(.text+0x1c5): undefined reference to `pthread_create'
prog.cpp:(.text+0x1e9): undefined reference to `pthread_create'
prog.cpp:(.text+0x1fe): undefined reference to `pthread_join'
prog.cpp:(.text+0x213): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
stdout