首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用线程条件变量的死锁程序,关键部分[C++]

使用线程条件变量的死锁程序,关键部分[C++]
EN

Stack Overflow用户
提问于 2022-11-15 08:02:39
回答 1查看 94关注 0票数 0

我要做的是,在main更改其他线程的结构之前,让每个线程在main中使用关键部分从struct复制信息。

代码语言:javascript
运行
复制
#include <iostream>
#include <pthread.h>

using namespace std;

struct foo
{
public:
   int var;
   int *turn;
   int index;
   pthread_mutex_t *bsem;
   pthread_cond_t *waitTurn;
};
void *threadFunc(void *arg) {
    int var;
    foo *workingVar = (foo *)arg;
    pthread_mutex_lock(workingVar->bsem);
    while (*workingVar->turn != workingVar->index)
        pthread_cond_wait(workingVar->waitTurn, workingVar->bsem);
    var = workingVar->var;
    *workingVar->turn++;
    pthread_cond_broadcast(workingVar->waitTurn);
    pthread_mutex_unlock(workingVar->bsem);
    cout << var << endl;
    return nullptr;
}
int main() {
   int turn = 0, NTHREADS = 5;
   foo mainStruct;
   pthread_mutex_t bsem;
   pthread_mutex_init(&bsem, NULL);
   pthread_cond_t waitTurn = PTHREAD_COND_INITIALIZER;
   mainStruct.bsem = &bsem;
   mainStruct.waitTurn = &waitTurn;
   mainStruct.turn = &turn;
   pthread_t tid[NTHREADS];
   for (int i = 0; i < NTHREADS; i++) {
   mainStruct.index = i;
   mainStruct.var = i;
   pthread_create(&tid[i], nullptr, threadFunc, &mainStruct);
   }
   for (int i = 0; i < NTHREADS; i++)
      pthread_join(tid[i], NULL);
}

上面的代码来自一个线程函数。我试图让线程等待,直到它们使用pthread_cond_wait“转向”,然后一旦条件为真,从main传递的结构信息将被复制到局部变量中,并将增加关键部分并退出(也不使用全局变量,因此互斥和条件变量是通过结构指针传递的)。循环被初始化为0,索引是线程号(按照创建它的顺序)。

此过程已陷入僵局,并已超时。

如果需要更多的上下文/信息,请告诉我,这是我的第一个堆栈溢出问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-18 10:59:33

我在mainStruct.index上看到了种族状况。主线程在没有锁的情况下修改它,多个线程在锁下访问它。因此,如果第一个线程快速启动,它将与您的循环生成线程交互。

看起来您计划拥有多个Foo实例,但您有一个实例。所以想象一下场景:

  1. 主螺纹到达第一连接
  2. 其他线程被创建,但还没有开始销毁
  3. 此时mainStruct.index的值是4
  4. 第一个线程开始执行并锁定acqurie。
  5. turn0workingVar->index4 (见第3点)
  6. 因此线程进入pthread_cond_wait并等待
  7. 下一个线程执行与点4-6相同的线程。
  8. 其他线程也一样
  9. 所有侧线程都处于等待状态。

所有线程都在等待,没有人调用过pthread_cond_broadcast条件,*workingVar->turn != workingVar->index总是true

而且,您的代码是用C编写的,而不是用C++编写的。唯一的C++是使用std::cout!尝试使用std::thread重写它,它将修复自身(如果您按值进行pas参数)。

这是我的C++版本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74442281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档