为了账号安全,请及时绑定邮箱和手机立即绑定

大虾们帮帮忙,看看我的代码,出什么问题了

大虾们帮帮忙,看看我的代码,出什么问题了

紫衣仙女 2023-03-03 15:11:19
#include <stdio.h>#include <pthread.h>pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;pthread_t tid1, tid2, tid3;void *thrd_1( void *arg){pthread_mutex_lock(&qlock);printf("thred_1..test1\n");sleep(2);printf("thred_1...test2\n");sleep(2);printf("thred_1..test3\n");sleep(2);printf("thred_1..test4\n");sleep(2);printf("thred_1..test5\n");sleep(2);printf("thred_1..test6\n");sleep(2);pthread_mutex_unlock(&qlock);}void *thrd_2(void *arg){pthread_mutex_lock(&qlock);sleep(2);printf("thred_2..test2\n");printf("thred_2..test1\n");sleep(2);printf("thred_2..test3\n");sleep(2);printf("thred_2..test4\n");sleep(2);printf("thred_2..test5\n");sleep(2);printf("thred_2..test6\n");sleep(2);pthread_mutex_unlock(&qlock); }void *thrd_3(){printf("thrd_3....test1\n");sleep(2);printf("thrd_3....test2\n");sleep(2);printf("thrd_3....test3\n");sleep(2);printf("thrd_3....test4\n");sleep(2);printf("thrd_3....test5\n");sleep(2);printf("thrd_3....test6\n");}int main(){int ret;ret = pthread_create(&tid1,NULL,thrd_1, NULL);ret = pthread_create(&tid2,NULL,thrd_2, NULL);ret = pthread_create(&tid3,NULL,thrd_3, NULL);while(1){printf("main sleep\n");sleep(2);};return 0;}就是创建了三个线程,三个线程都是每隔两秒打印一次printf函数,其中的话第一个线程跟第二个线程加锁,但第三个线程没有加锁,理论上如果假设第一个线程创建出来,它加上锁之后是不是应该把锁之中的printf都输出完后在执行别的,但是结果却不是这样,在线程1打印printf的过程中,线程3中的printf也打印了出来,结果如下:
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

多线程的效果就是同一时间各个线程都在执行。
加锁不是给线程上锁。
pthread_mutex_lock(&qlock);表示尝试去把qlock上锁,它会先判断qlock是否已经上锁,如果已经上锁这个线程就会停在这一步直到其他线程把锁解开。它才继续运行。
所以代码中要么是线程1先执行完后执行线程2,要么就是线程2先执行,再执行线程1.而线程3一开始就执行了。
互斥量mutex是用来给多线程之间的贡献资源上锁的。也就是同一个时间只允许一个线程去访问该资源(资源:比如对文件的写操作)。
现在来回答楼主的问题:
不是只要在pthread_mutex_lock(&qlock)与pthread_mutex_unlock(&qlock)之间的代码执行,其他的都不能介入吗?
其他的都不能介入,不是整个进程只运行这一个线程,其他线程都停住了。
“不能介入“这个动作需要程序员自己设计来保证:好比前面提到的文件读写操作。为了防止多个线程同时对文件进行写入操作,这就需要把资源上锁了。
如果只有线程1加锁,那是不是这个锁就没有意义了呢?
这个理解可以有

查看完整回答
反对 回复 2023-03-06
?
莫回无

TA贡献1865条经验 获得超7个赞

互斥锁的概念是:当获取不到锁时将线程睡眠,此时CPU可以调度其它线程,线程3没有获取这个锁,所以和线程1/2没有关联,和他们锁不锁没有关系。

查看完整回答
反对 回复 2023-03-06
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

线程1和线程2都是请求同一个锁的所有权,因为每次只能有一个获取所有权,所以线程1、2同时只能执行一个,线程3不需要获取锁,当给它分配了时间片之后就可以执行了

查看完整回答
反对 回复 2023-03-06
  • 3 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信