通过它自己的条件变量c ++控制每个线程
Control each thread by it's own condition variable c++
我正在尝试创建一个程序,其中有一个主线程和多个工作线程。工作线程将在共享队列中注册自己,并等待来自主线程的信号继续前进。主线程将检查队列的前端,并通过使用它自己的特定条件变量向该线程发出信号,以继续前进。这是我现在拥有的伪代码,
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);
}
在这段代码中,结构 condition 保存特定线程的条件变量和锁,我通过它自己的 cond_var 锁定工作线程并将锁存储在 struct condition 和然后在主线程中使用相同的存储锁和队列中的 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);
我正在尝试创建一个程序,其中有一个主线程和多个工作线程。工作线程将在共享队列中注册自己,并等待来自主线程的信号继续前进。主线程将检查队列的前端,并通过使用它自己的特定条件变量向该线程发出信号,以继续前进。这是我现在拥有的伪代码,
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);
}
在这段代码中,结构 condition 保存特定线程的条件变量和锁,我通过它自己的 cond_var 锁定工作线程并将锁存储在 struct condition 和然后在主线程中使用相同的存储锁和队列中的 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);