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

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

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

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t number_mutex;

//out数组是全局变量,100个元素全部初始化为0,2个线程共同为out数组赋值
int out[100];

//线程1
void 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);
    }
}

//线程2
void 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个数组元素全部赋成了新值。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值