线程同步1 ------ 互斥锁 ------一个更加典型的例子

来源:互联网 发布:淘宝怎样装修商品 编辑:程序博客网 时间:2024/06/15 15:11

      上一篇博文里,举了一个简单的应用共享锁的例子。本篇博文将介绍一个稍微更加复杂点的例子。

      有一个全局变量数组out,包含100个元素,所有元素初始化为0。然后开启2个子线程同时对数组out进行赋值操作。在此过程,应该启用共享锁对赋值代码进行同步。具体代码如下:

#include <stdio.h>#include <pthread.h>pthread_mutex_t number_mutex;//out数组是全局变量,100个元素全部初始化为0,2个线程共同为out数组赋值int out[100];//线程1void thread1(){    int i;    while(1){        printf("Thread 1 operated.\n");        pthread_mutex_lock(&number_mutex);        for(i=0;i<100;i++){            if(out[i]==0){//尚未赋值的元素,则将其赋值                out[i]=1111;                break;            }        }        //如果最后一个元素都已经被赋值了,则解锁,之后退出本线程        if(out[99]!=0)        {            pthread_mutex_unlock(&number_mutex);            return;        }        pthread_mutex_unlock(&number_mutex);    }}//线程2void thread2(){    int i;    while(1){        printf("Thread 2 operated.\n");        pthread_mutex_lock(&number_mutex);        for(i=0;i<100;i++){            if(out[i]==0){                out[i]=2222;                break;            }        }                if(out[99]!=0)        {            pthread_mutex_unlock(&number_mutex);            return;        }        pthread_mutex_unlock(&number_mutex);    }}main(){//对out数组的100个元素赋初值    int i;    for(i=0;i<100;i++){        out[i]=0;    }    pthread_t thid1,thid2;    printf("This is Main Thread.\n");    pthread_mutex_init(&number_mutex,NULL);    pthread_create(&thid1,NULL,thread1,NULL);    pthread_create(&thid2,NULL,thread2,NULL);    int status1,status2;    pthread_join(thid1,(void*)&status1);    pthread_join(thid2,(void*)&status2);    pthread_mutex_destroy(&number_mutex);//输出数组100个元素的新值    for(i=0;i<100;i++){        printf("%d, ",out[i]);    }    printf("\nMain Thread exit\n");}

运行结果如下:



      从运行情况看,2个线程交替运行,将100个数组元素全部赋成了新值。