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来查看对应的手册。

 

 

  

转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

------------------------------------------------------------------------------------------------

一定要专业!本博客定位于ArcGIS开发,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值