通过自己的条件变量 c++ 控制每个线程

Control each thread by it's own condition variable c++

本文关键字:控制 线程 c++ 变量 自己的 条件      更新时间:2023-10-16

我正在尝试创建一个有一个主线程和多个工作线程的程序。工作线程将自己注册在一个共享队列中,并等待主线程的信号继续前进。主线程将检查队列的前面,并使用它自己的特定条件变量向该线程发出信号,继续前进。以下是我现在拥有的伪代码,

struct condition{
pthread_cond_t cond_var;
pthread_mutex_t lock;
};
queue<condition> queue; 
pthread_mutex_t lock;
pthread_cond_t cond;
void *Master()
{   
    while(/* some condition*/)
    {
        pthread_mutex_lock( &lock );
        condition next_obj;
        if(!queue.empty())
        {
            next_obj = queue.front();
            landing_queue.pop();
            pthread_cond_signal( &next_obj.cond_var );
        }
        pthread_cond_broadcast( &cond );
        pthread_mutex_unlock( &lock );
        sleep(2 sec);
    }
    pthread_exit(NULL);
}
void *Woker()
{
    condition new_obj;
    pthread_mutex_init(&new_obj.lock, NULL);
    pthread_cond_init(&new_obj.cond_var, NULL);
    pthread_mutex_lock( &new_obj.lock );
    pthread_mutex_lock( &lock );
    pthread_cond_wait( &cond, &lock );
    queue.push(new_obj);
    pthread_cond_broadcast( &cond );
    pthread_mutex_unlock( &lock );
    pthread_cond_wait( &new_obj.cond_var, &new_obj.lock );
    pthread_exit(NULL);
}

在这段代码中,structcondition保存特定线程的条件变量和锁,我通过它自己的cond_var和存储在structcondition中的锁来锁定工作线程,然后在主线程中使用队列中相同的存储锁和cond_var来解锁它。现在一切都很好,但主线程给工作线程的信号不起作用,即使在主线程发送信号后,工作线程仍在等待。请告诉我,如果流程有问题,或者是否有其他方法可以实现这一点。

光有条件变量和互斥是不够的:条件变量需要与某个共享状态上的条件配对(因此得名)。一个简单的例子是用一个标志变量来扩充condition结构:

struct condition {
    pthread_cond_t cond_var;
    pthread_mutex_t lock;
    int flag;
};

其中flag变量由lock互斥对象保护。

然后,工作线程可以使用条件变量来等待flag的设置:

void *Woker()
{
    condition new_obj;
    pthread_mutex_init(&new_obj.lock, NULL);
    pthread_cond_init(&new_obj.cond_var, NULL);
    new_obj.flag = 0;
    /* publish new_obj to queue */
    pthread_mutex_lock(&lock);
    queue.push(new_obj);
    pthread_mutex_unlock(&lock);
    /* Wait for flag to be set */
    pthread_mutex_lock(&new_obj.lock);
    while (!new_obj.flag)
        pthread_cond_wait(&new_obj.cond_var, &new_obj.lock);
    pthread_mutex_unlock(&new_obj.lock);
    pthread_exit(NULL);
}

并且您的主线程将设置标志并发出条件信号:

pthread_mutex_lock(&next_obj.lock);
next_obj.flag = 1;
pthread_cond_signal(&next_obj.cond_var);
pthread_mutex_unlock(&next_obj.lock);