gpt4 book ai didi

c - 多线程程序额外运行while循环次数

转载 作者:行者123 更新时间:2023-11-30 15:15:30 25 4
gpt4 key购买 nike

我正在做一个家庭作业,我必须用 C 语言编写一个多线程 Linux 程序来解决操作系统类的生产者-消费者问题。在我的代码中,我有一个 while 循环,它位于由单个线程运行的函数内。在该函数中,我对一个受互斥锁保护的变量进行了增量。

问题是,有时,while 循环的运行时间会比我预期的要长。例如,当我期望循环执行 16 次时,它有时会执行 17 次。我无法弄清楚这个错误的原因,但它似乎与线程有关。我已经最小化了我的代码,问题仍然可以重现。

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>

int numItems = 16;
pthread_t threadID;
pthread_t threadID2;

pthread_mutex_t mutex;

pthread_attr_t attr;


void *produce(void *param);

int numItemsProduced = 0;

int main(int argc, char *argv[])
{

pthread_attr_init(&attr);
// Initialize mutex.
if (pthread_mutex_init(&mutex, NULL) != 0)
{
printf("%s\n", "An error occured while initializing mutex!");
}

pthread_create(&threadID, &attr, produce, NULL);

pthread_create(&threadID2, &attr, produce, NULL);

pthread_join(threadID, NULL);
pthread_join(threadID2, NULL);


printf("Finished.\n");
}


void *produce(void *param)
{
printf("In thread.\n");
while (numItemsProduced < numItems)
{
pthread_mutex_lock(&mutex);
printf("Current while loop is at int %d\n", numItemsProduced);

numItemsProduced++;

pthread_mutex_unlock(&mutex);
}

pthread_exit(0);
}

为什么while循环有时会执行额外的时间?我相信我正确使用了互斥体

最佳答案

该问题是由于线程进入 while 循环后等待互斥体引起的。输入关键代码后需要再次检查条件:

pthread_mutex_lock(&mutex);
if (numItemsProduced < numItems){
printf("Current while loop is at int %d\n", numItemsProduced);
numItemsProduced++;
}

pthread_mutex_unlock(&mutex);

关于c - 多线程程序额外运行while循环次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33592089/

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