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

#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也打印了出来,结果如下:









紫衣仙女
浏览 75回答 3
3回答

繁星coding

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

莫回无

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

慕虎7371278

线程1和线程2都是请求同一个锁的所有权,因为每次只能有一个获取所有权,所以线程1、2同时只能执行一个,线程3不需要获取锁,当给它分配了时间片之后就可以执行了
打开App,查看更多内容
随时随地看视频慕课网APP