linux多线程编程之线程安全 mutex锁的使用

时间:2021-07-12 17:39:54

由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好!

所以改成多线程了,但是一直没有用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来查看对应的手册。