C/C++两个线程交替执行
c++有两个线程,一个线程输出1,3,5,7,…,另一个线程输出2,4,6,8…
1.利用互斥量的简单实现
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pthread.h>
using namespace std;
pthread_mutex_t mutex;
int i=0;
void* print(void *){
while(1){
pthread_mutex_lock(&mutex);
printf("thread=%d,,,,i=%d\n",pthread_self(),++i);
pthread_mutex_unlock(&mutex);
usleep(1000);
}
return NULL;
}
int main(int argc,char *argv[]){
pthread_t thread[2];
pthread_mutex_init(&mutex,NULL);
for(int i=0;i<2;i++){
int temp=pthread_create(&thread[i],NULL,print,NULL);
}
sleep(1);
pthread_detach(thread[0]);
pthread_detach(thread[1]);
pthread_mutex_destroy(&mutex);
return 0;
}
//这里有一个问题就是会出现一个线程多次打印的情况(时间片未用完)
利用信号量可以解决这个问题
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
pthread_mutex_t mutex;
sem_t first;
sem_t second;
int i=0;
void* print1(void *){
while(1){
sem_wait(&first);
pthread_mutex_lock(&mutex);
printf("thread=%d,,,,i=%d\n",pthread_self(),++i);
pthread_mutex_unlock(&mutex);
sem_post(&second);
}
return NULL;
}
void* print2(void *){
while(1){
sem_wait(&second);
pthread_mutex_lock(&mutex);
printf("thread=%d,,,,i=%d\n",pthread_self(),++i);
pthread_mutex_unlock(&mutex);
sem_post(&first);
}
return NULL;
}
int main(int argc,char *argv[]){
pthread_t thread[2];
pthread_mutex_init(&mutex,NULL);
sem_init(&first,0,1);
sem_init(&second,0,0);
pthread_create(&thread[0],NULL,print1,NULL);
pthread_create(&thread[1],NULL,print2,NULL);
sleep(1);
pthread_detach(thread[0]);
pthread_detach(thread[1]);
pthread_mutex_destroy(&mutex);
return 0;
}