gpt4 book ai didi

c++ - 多线程 - 彼得森的算法不起作用

转载 作者:太空狗 更新时间:2023-10-29 20:52:02 26 4
gpt4 key购买 nike

这里我使用Peterson的算法来实现互斥。

我有两个非常简单的线程,一个将计数器加 1,另一个将它减 1。

const int PRODUCER = 0,CONSUMER =1;
int counter;
int flag[2];
int turn;

void *producer(void *param)
{

flag[PRODUCER]=1;
turn=CONSUMER;
while(flag[CONSUMER] && turn==CONSUMER);

counter++;

flag[PRODUCER]=0;
}

void *consumer(void *param)
{
flag[CONSUMER]=1;
turn=PRODUCER;
while(flag[PRODUCER] && turn==PRODUCER);

counter--;

flag[CONSUMER]=0;
}

当我只运行一次时,它们工作正常。

但是当我再次循环运行它们时,奇怪的事情发生了。

这是我的主要函数。

int main(int argc, char *argv[])
{
int case_count =0;
counter =0;
while(counter==0)
{
printf("Case: %d\n",case_count++);
pthread_t tid[2];
pthread_attr_t attr[2];

pthread_attr_init(&attr[0]);
pthread_attr_init(&attr[1]);

counter=0;
flag[0]=0;
flag[1]=0;
turn = 0;

printf ("Counter is intially set to %d\n",counter);

pthread_create(&tid[0],&attr[0],producer,NULL);
pthread_create(&tid[1],&attr[1],consumer,NULL);

pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);

printf ("counter is now %d\n",counter);
}

return 0;
}

我一次又一次地运行这两个线程,直到在一种情况下计数器不为零。

然后,经过几种情况,程序总会停止!有时是数百个案例,有时是数千个,甚至是数万个事件。

这意味着在一种情况下计数器不为零。但为什么???这两个线程在关键 session 中修改计数器,并且只增加和减少一次。为什么计数器不会为零?

然后我在其他电脑上运行这段代码,更奇怪的事情发生了——在一些电脑上程序似乎没有问题,而其他电脑和我有同样的问题!为什么?

顺便说一句,在我的电脑中,我在 VM ware 的虚拟电脑 Ubuntu 16.04 中运行这段代码。别人的电脑也是Ubuntu 16.04,但不是都在虚拟机里。并且出现问题的计算机既有虚拟机也有真机。

最佳答案

Peterson 算法仅适用于单核处理器/单 CPU 系统。

那是因为它们不进行真正的并行处理。两个原子操作永远不会在那里同时执行。

如果您有 2 个或更多 CPU/CPU 核心,则每个 cpu(核心)可以同时执行的原子操作数量增加一个。这意味着,即使整数赋值是原子的,它也可以在不同的 CPU/内核中同时执行多次。

在您的情况下,turn=CONSUMER/PRODUCER; 只是在不同的 CPU/内核中同时被调用两次。

停用所有 CPU 内核,但一个用于您的程序,它应该可以正常工作。

关于c++ - 多线程 - 彼得森的算法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47456497/

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