多线程练习2

来源:互联网 发布:华为手机彻底删除数据 编辑:程序博客网 时间:2024/05/01 21:16

多线程练习:

两个线程一起打印数从1到9,线程1打印所有不是3的倍数的数,线程2打印3的倍数。

1.用互斥锁+条件变量的方法

2.用信号量的方法(代码中sleep的位置比较重要)


1.用互斥锁+条件变量的方法的代码

#include <pthread.h>#include <stdio.h>#include <stdlib.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/void *thread1(void *);void *thread2(void *);int i=1;int main(void){    pthread_t t_a;    pthread_t t_b;    pthread_create(&t_a,NULL,thread2,(void *)NULL);/*创建进程t_a*/    pthread_create(&t_b,NULL,thread1,(void *)NULL); /*创建进程t_b*/    pthread_join(t_a, NULL);    pthread_join(t_b, NULL);/*等待进程t_b结束*/    pthread_mutex_destroy(&mutex);    pthread_cond_destroy(&cond);    exit(0);}void *thread1(void *arg){    for(i=1;i<=9;i++)     {        pthread_mutex_lock(&mutex);/*锁住互斥量*/        if(i%3==0)             pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/        else                     printf("thead1:%d\n",i);        pthread_mutex_unlock(&mutex);/*解锁互斥量*/sleep(1);}}void *thread2(void *arg){    while(i<9)    {        pthread_mutex_lock(&mutex);if(i%3!=0)            pthread_cond_wait(&cond,&mutex);/*等待*/        printf("thread2:%d\n",i);        pthread_mutex_unlock(&mutex);sleep(1);}}


信号量实现的源码:

#include <pthread.h>#include <stdio.h>#include <semaphore.h>void *thread1(void *);void *thread2(void *);sem_t s[2];int i=1;int main(void){sem_init(&s[0], 0, 1);sem_init(&s[1], 0, 0);pthread_t t_a;pthread_t t_b;pthread_create(&t_a,NULL,thread2,(void *)NULL);/*创建进程t_a*/pthread_create(&t_b,NULL,thread1,(void *)NULL); /*创建进程t_b*/pthread_join(t_a, NULL);pthread_join(t_b, NULL);/*等待进程t_b结束*/return 0;}void *thread1(void *arg){for(i=1; i<=9; i++) {sem_wait(&s[0]);if(0 == i%3) {sem_post(&s[1]);sleep(1); } else {printf("thread 1, i = %d\n", i);sem_post(&s[0]);}}}void *thread2(void *arg){while(i < 9) {//sleep(1);sem_wait(&s[1]);printf("thread 2, i = %d\n", i);sem_post(&s[0]);}}



0 0