gpt4 book ai didi

c - 多线程(pthread)竞争代码

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:47 25 4
gpt4 key购买 nike

#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和多线程的新手,这段代码的结果是from main xx and child1很少出现,三个线程从来没有一起出现,请问是什么问题?

最佳答案

关键部分的大部分时间将花在 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在许多方面。您不希望任何线程“饿死”,但您在线程之间争用全局计数器,并且您希望强制执行有序执行。

关于c - 多线程(pthread)竞争代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17850281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com