linux多線程編程之安全執行緒 mutex鎖的使用

來源:互聯網
上載者:User

由於之前寫的本來說多進程,但是由於需要共用資源(也就是共用一些變數),雖然進程通過其他方法可以實現共用資源,但是還是覺得用線程比較好!

所以改成多線程了,但是一直沒有用mutex,出現了不少段錯誤。我覺得勢必和資源共用有許多關係!

本來安全執行緒 的 資源共用 我覺得 用個變數來控制就行,比如

int lock_x=0;

線上程中

if(lock_x==1) usleep(20);//休息20毫秒 、、這裡我還害怕死迴圈呢

lock_x=1;

//do change of x

lock_x=0;

這樣看起來好,實際上也不咋樣吧。pthread_mutex(看參考資料1)我早就知道,但是不知具體用法,其實用法比上面的要簡單,而且可以少寫一句話,而且肯定比我的線程資料安全了。

我就寫個例子吧。多線程的 共用資源修改樣本:

/*
============================================================================
Name : mutex_test.c
Author : ayanmw
Version :
Copyright : CopyRight ptopn.com
Description : Hello World in C, Ansi-style
============================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
int x=0;
pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER;
void *client(int *data){
pthread_mutex_lock(&mutex_x);
fprintf(stdout,"%d:mutex_lock\n",data);
x++;
fprintf(stdout,"%d:mutex 正在修改x的值:%d\n",data,x);
sleep(1);
pthread_mutex_unlock(&mutex_x);
fprintf(stdout,"%d:mutex_unlock\n",data);

}
int main(void) {
int i=1;
pthread_t threadInfo;
pthread_attr_t threadInfo_attr;

pthread_create(&threadInfo,NULL,client,(void *)1);
pthread_create(&threadInfo,NULL,client,(void *)2);
pthread_create(&threadInfo,NULL,client,(void *)3);

pthread_join(threadInfo,NULL);
//fprintf(stdout,"Hi");
return EXIT_SUCCESS;
}

運行結果如下:

2:mutex_lock
2:mutex 正在修改x的值:1//此處停留1s
2:mutex_unlock
3:mutex_lock
3:mutex 正在修改x的值:2//此處停留1s
3:mutex_unlock
1:mutex_lock
1:mutex 正在修改x的值:3//此處停留1s

前面的數字 因為情況不同,也會順序有變化的,如果把mutex_lock And Unlock 去掉,運行結果是這樣子的:

2:mutex_lock
2:mutex 正在修改x的值:1
1:mutex_lock
3:mutex_lock
3:mutex 正在修改x的值:2
1:mutex 正在修改x的值:3
2:mutex_unlock
3:mutex_unlock
1:mutex_unlock

注意:我的程式編譯會警示告,因為我把int直接 當 指標傳遞,使用不能用 *data的。因為靈活變通嘛,我才這樣寫。實際還要要規範下代碼的!

上面的樣本程式,實際情況是一個socket伺服器,沒接收到一個用戶端串連,就建立一個線程,進行串連。本身繼續監聽。用戶端 單線程。

 

參考資料:Linux多線程編程的高效開發經驗:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

ubuntu man手冊

ubuntu內建的man不全,需要安裝

           manpages
           manpages-zh  //這個我認為沒必要進行設定,安裝即可用。但是這個是一些常用的中文man,而不是全部。man bind 會顯示中文,看起來舒服多了。如果man中文計劃全部翻譯就好了。
           manpages-dev
           libstdc++6-4.4-doc
           manpages-posix
           manpages-posix-dev

這個可以根據apt-get install manpages- 按tab會顯示可安裝的軟體包(ubuntu的這個設定太方便了,好用)。

通過man -k thread/man -k pthread /man -k pthread_mutex /man -k pthread_cond

來查詢相關的man手冊 然後man 3posix thread_create來查看對應的手冊。

 

 

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.