linux 线程安全 mutex 锁的使用
来源:互联网 发布:2016chinajoy数据 编辑:程序博客网 时间:2024/05/19 02:24
由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好!
所以改成多线程了,但是一直没有用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这个好框架,对前端后端数据库 都很感觉亲切啊。.
- linux 线程安全 mutex 锁的使用
- 谈mutex的使用和线程安全、可重入
- 线程同步技术二:Mutex的使用
- 线程同步之互斥量mutex的使用
- 线程同步之互斥量mutex的使用
- Linux线程同步: 互斥量(mutex)
- Linux线程同步-----互斥量(Mutex)
- LINUX下的线程同步——mutex和读写锁
- Linux利用mutex互斥锁实现线程的互斥
- Linux编程学习之线程篇-Mutex的死锁
- 利用boost::mutex实现线程安全列表模板类,附源码及使用例子
- C++11:基于std::queue和std::mutex构建一个线程安全的队列
- 线程安全的AtomicLong使用
- 线程安全的AtomicLong使用
- 线程安全的AtomicLong使用
- 自旋锁,Mutex和信号量的使用
- Mutex的使用
- Mutex的使用
- Android 用Animation-list实现逐帧动画
- 关于linux进程、lwp、线程的理解
- [Android实例] android动画效果切换案例
- [Android实例] Android activity动画跳转案例分析
- 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
- linux 线程安全 mutex 锁的使用
- Android 动画
- ------------------------MSSQL中排列组合的实现------------------------------------
- poj2455 Secret Milking Machine 网络流 最大流 二份答案
- HDU-1242 Rescue
- android_launcher的源码详细分析
- Android动画入门
- win8开发应用之二:管理应用生命周期和状态(使用 C# 和 XAML 的 Metro 风格应用)
- IOS开发之百度地图API应用