gpt4 book ai didi

c - 使用 pthreads 的段错误

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

我正在编写一个程序来测试我对条件变量的理解。基本上,线程 0 检查计数是否为偶数,如果是,则递增它。如果不是,则它向线程 1 发出信号,线程 1 会增加计数变量。该过程一直持续到计数达到 15。这是我的代码:

#include <pthread.h>
#include <stdio.h>
#define numThreads 2

int count=0;
pthread_mutex_t count_mutex;
pthread_cond_t count_threshold_cv;


void *checkEven(void *threadId)
{ while(count<=15){
//lock the mutex
pthread_mutex_lock(&count_mutex);
printf("even_thread: thread_id=%d count=%d\n",threadId,count);
if(count%2==0){
count++;
}
else{
printf("Odd count found, signalling to odd thread\n");
pthread_cond_signal(&count_threshold_cv);
}
pthread_mutex_unlock(&count_mutex);
sleep(1);
}
}

void *checkOdd(void *threadId)
{
pthread_mutex_lock(&count_mutex); //obtain a lock
while(count<=15){
pthread_cond_wait(&count_threshold_cv, &count_mutex); //wait() relinquishes the lock
count++;
printf("odd_thread: thread_id=%d, count=%d\n",threadId,count);
}
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}

int main()
{
pthread_t threads[numThreads];
int rc;
int a=0;
int b=0;
pthread_create(&threads[0], NULL, checkEven, (void *)a);
pthread_create(&threads[1], NULL, checkEven, (void *)b);
pthread_join(0,NULL);
pthread_join(1,NULL);
pthread_exit(NULL);
}

有人能告诉我为什么会出现段错误(核心转储)错误吗?我知道当一个进程试图侵犯其他进程的地址空间时会发生此错误,但仅此而已。有人可以帮忙吗?谢谢!

最佳答案

您将零作为要加入的线程传递给 pthread_join:

pthread_join(0,NULL);

你想要:

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

不过,您还有其他几个错误。一方面,您的 checkOdd 代码会调用 pthread_cond_wait,即使轮到该线程也是如此。

你好像不太了解条件变量。具体来说,您似乎认为条件变量会以某种方式知道您正在等待的事情是否已经发生。它不是——条件变量是无状态的。跟踪您正在等待的事情以及它是否已经发生是您的工作。

关于c - 使用 pthreads 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40553737/

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