上一篇博文裏,舉了一個簡單的應用共享鎖的例子。本篇博文將介紹一個稍微更加複雜點的例子。
有一個全局變量數組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個數組元素全部賦成了新值。