博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux线程同步---互斥锁
阅读量:5138 次
发布时间:2019-06-13

本文共 2229 字,大约阅读时间需要 7 分钟。

线程中互斥锁使用的步骤与信号量相似!

1、首先定义互斥锁变量,并初始化

pthread_mutex_t mutex_lock;

pthread_mutex_init(&mutex_lock,NULL);
2、在操作前对互斥量进行加锁操作

pthread_mutex_lock(&mutex_lock);

3、操作完毕后进行解锁操作

pthread_mutex_unlock(&mutex_lock);

所有操作均在加锁和解锁操作之间进行,保证同时仅仅对有一个操作对关键变量或是区域进行操作。

下面是自己写的一个小程序,对主函数对变量自加操作,而线程函数进行自减操作。

(该程序有个小bug,看官可执行运行一下,就知道结果了,高手一看就知道问题在哪里,哈哈!卖个关子!)

pthread_mutex_lock(&mutex_lock);对某个互斥锁变量进行加锁操作时,当该变量已经被另外一个线程锁住时,该线程会被阻塞(英文原文为block),可以理解为休眠。

由操作系统基本原理可知,当进程处于就绪状态时,才会获得处理机的时间片,换句话说就是能能被调度到处理机上执行,而阻塞状态则不能。

因此一个线程被阻塞后,将不会执行,处于等待状态,通常是等待某个事件发生或到来。因此,一个对已经加锁的变量进行加锁的线程将被阻塞,其只能等待另外一个线程解锁,才能继续执行。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 void *thread_function(void *arg); 9 pthread_mutex_t mutex_lock;10 int globaltmp=0;11 int main(){12 int res;13 pthread_t pthread_tmp;14 pthread_mutex_init(&mutex_lock,NULL);15 pthread_mutex_lock(&mutex_lock);16 res = pthread_create(&pthread_tmp,NULL,thread_function,NULL);17 if(res != 0){18 perror("thread creation failed!");19 exit(EXIT_FAILURE);20 }21 while(1){22 pthread_mutex_unlock(&mutex_lock);23 sleep(2);24 globaltmp++;25 printf("in the main func,globaltmp=%d\n",globaltmp);26 res = pthread_mutex_lock(&mutex_lock); 27 // if(res == EDEADLK)28 {29 // printf("it has been locked in the thread!\n");30 }31 // printf(" main func res =%d\n",res);32 sleep(2);33 }34 res = pthread_join(pthread_tmp,NULL);35 if(res != 0 ){36 perror("thread join is failure");37 exit(EXIT_FAILURE);38 }39 printf("thread joined!\n");40 pthread_mutex_destroy(&mutex_lock);41 return 0;42 }43 void *thread_function(void *arg){44 int res ;45 res = pthread_mutex_lock(&mutex_lock);46 if(res == EDEADLK)47 printf("it has been locked in the main!\n");48 while(1)49 {50 pthread_mutex_unlock(&mutex_lock);51 sleep(1);52 globaltmp--;53 printf("in the pthread func,globaltmp=%d\n",globaltmp);54 // printf("I am in the pthread func\n");55 res = pthread_mutex_lock(&mutex_lock);56 // printf("thread func res=%d\n",res);57 // if(res == EDEADLK)58 // printf("it has been locked in the main!\n");59 sleep(1);60 }61 pthread_exit(NULL);62 }

 

转载于:https://www.cnblogs.com/farbeyond/p/4482859.html

你可能感兴趣的文章
git小结
查看>>
leetcode做题中的一些小总结,很分散,待整理
查看>>
在centos6.8上源码安装MySQL
查看>>
GetDc函数与GetWindowDC函数的区别
查看>>
marshal intptr to delegate
查看>>
目前js比较流行的js框架
查看>>
C# 插入文本框到PPT幻灯片
查看>>
权限问题
查看>>
Python基础二
查看>>
Kindle Paperwhite 2使用体验
查看>>
touch
查看>>
Leetcode::Best Time to Buy and Sell Stock11
查看>>
POJ 1113 Wall 求凸包
查看>>
POJ 2981 Strange Way to Express Integers 模线性方程组
查看>>
母函数学习篇。
查看>>
redis有哪些功能
查看>>
程序员永远的痛之字符编码的奥秘
查看>>
Ajax向服务器请求对表单和表格进行操作
查看>>
Hive集成Hbase
查看>>
字符串自实现的拼接
查看>>