gpt4 book ai didi

c - 多线程程序中的输出

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

在多线程上编写我的基本程序时遇到了一些困难。

在下面的程序中,如果我在位置 1 休眠,则打印的共享数据的值始终为 10,而在位置 2 保持休眠时,共享数据的值始终为 0。

为什么会出现这种输出?如何决定我们应该在哪个地方 sleep 。这是否意味着如果我们在互斥体中放置一个 sleep ,那么另一个线程根本不会被执行,因此共享数据为 0。

    #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>

pthread_mutex_t lock;

int shared_data = 0;

void * function(void *arg)
{
int i ;
for(i =0; i < 10; i++)
{
pthread_mutex_lock(&lock);
shared_data++;
pthread_mutex_unlock(&lock);
}

pthread_exit(NULL);
}


int main()
{
pthread_t thread;
void * exit_status;
int i;

pthread_mutex_init(&lock, NULL);

i = pthread_create(&thread, NULL, function, NULL);

for(i =0; i < 10; i++)
{
sleep(1); //POSITION 1
pthread_mutex_lock(&lock);
//sleep(1); //POSITION 2
printf("Shared data value is %d\n", shared_data);
pthread_mutex_unlock(&lock);
}

pthread_join(thread, &exit_status);

pthread_mutex_destroy(&lock);
}

最佳答案

如果您在锁定互斥量之前进入休眠状态,那么您就是在给其他线程足够的时间来更改共享变量的值。这就是为什么您会在位置 #1 看到“ sleep ”值为“10”的原因。

当您首先获取互斥量时,您可以足够快地锁定它,以便您可以在其他线程有机会修改它之前打印出该值。另一个线程等待并阻塞 pthread_mutex_lock() 调用,直到您的主线程完成休眠并将其解锁。那时,第二个线程终于开始运行并更改值。这就是为什么您在位置 #2 看到“ sleep ”值为“0”的原因。

这是竞争条件的经典案例。在不同的机器上,相同的代码可能不会在位置 #2 的 sleep 调用中显示“0”。在您的主线程锁定互斥体之前,第二个线程完全有可能有机会更改一次或两次变量的值。互斥量可以确保两个线程不会同时访问同一个变量,但它无法控制两个线程访问它的顺序。

关于c - 多线程程序中的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342739/

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