您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-04 11:19 246 查看
      上一篇博文里,举了一个简单的应用共享锁的例子。本篇博文将介绍一个稍微更加复杂点的例子。

      有一个全局变量数组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个数组元素全部赋成了新值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C c语言 线程 多线程