線程同步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個數組元素全部賦成了新值。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章