#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
int global;
int i = 30;
int j = 30;
int k = 30;
pthread_mutex_t mutex;
void* child1(void* arg)
{
while(k--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from child1\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
}
void* child2(void* arg)
{
while(j--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from child1\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid1, tid2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid1, NULL, child1, NULL);
pthread_create(&tid2, NULL, child2, NULL);
while(i--)
{
pthread_mutex_lock(&mutex);
global++;
printf("from main\n");
printf("%d\n",global);
pthread_mutex_unlock(&mutex);
}
return 0;
}
我是pthread和多线程的新手,这段代码的结果是来自主xx 而 child1 很少出现,三个线程永远不会出现在一起,有什么问题?
答案 0 :(得分:2)
关键部分的大部分时间都将花在printf
来电中。你可以试试:
{
int local;
pthread_mutex_lock(& mutex);
local = ++global;
pthread_mutex_unlock(& mutex);
printf("from <fn>\n%d\n", local);
}
然而,这仍然没有给出“公平性”的任何保证,但是printf
调用很可能使用系统调用或I / O事件来导致调度程序踢进去。
您的程序在很多方面与Dining Philosophers Problem类似。您不希望任何线程“饿死”,但您在全局计数器的线程之间存在争用,并且您希望强制执行有序执行。
答案 1 :(得分:0)
代码中的一个建议替换printf(“from child1 \ n”); to printf(“from child2 \ n”);在void * child2(void * arg)函数中。如果您想确保所有线程都完成,请在main函数结束时添加以下行。 在pthread_join(TID1,NULL); 在pthread_join(TID2,NULL);
答案 2 :(得分:0)
我认为你应该使用3种不同的互斥锁,顺便使用条件控制以避免不安全访问