上一篇博文里,举了一个简单的应用共享锁的例子。本篇博文将介绍一个稍微更加复杂点的例子。
有一个全局变量数组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个数组元素全部赋成了新值。