由於之前寫的本來說多進程,但是由於需要共用資源(也就是共用一些變數),雖然進程通過其他方法可以實現共用資源,但是還是覺得用線程比較好!
所以改成多線程了,但是一直沒有用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來查看對應的手冊。