我今天写了一个pthread代码:
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *thread1(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
sleep(1);
printf("thread1...\n");
pthread_mutex_unlock(&mutex);
}
}
void *thread2(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
sleep(1);
printf("thread2...\n");
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
我希望它会像:
一样运行thread1...
thread2...
thread1...
thread2...
但事实上它运行:
thread1...
thread1...
thread1...
thread1...
线程2似乎没有运行。 因此我运行这段代码超过一小时, thread2只打印一行。 他们为什么不进行隔行扫描?
我的环境:
谢谢。
答案 0 :(得分:2)
将睡眠移动到互斥锁之外,以便释放操作系统进程调度算法以查看其他线程。问题是,当你睡觉时,另一个线程可以被安排,但锁被设置,所以它没有。当线程1唤醒时,它会释放锁定,但然后向后循环以设置它。线程2几乎没有机会进入。它正在被饿死。