linux多线程编程之线程安全 mutex锁的使用
由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好!
所以改成多线程了,但是一直没有用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来查看对应的手册。
------------------------------------------------------------------------------------------------
一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。