use*_*210 2 c mutex pthreads producer-consumer conditional-statements
我对如何初始化和实现pthread互斥和条件变量有点困惑.该程序的目标是让生产者在队列中放置一定数量的整数,并且消费者将整数排除在队列之外.我还必须能够定义创建的生产者和消费者线程的数量.在入门代码中,我给出了这些:
// Locks & Condition Variables
pthread_mutex_t lock; // Lock shared resources among theads
pthread_cond_t full; // Condition indicating queue is full
pthread_cond_t empty; // Condition indicating queue is empty
Run Code Online (Sandbox Code Playgroud)
作为共享资源.在//TODOmain方法的注释中,其中一个步骤是初始化锁和条件变量.我对pthread mutex和条件的理解非常薄弱,所以我会说:
lock = PTHREAD_MUTEX_INIT;
full = PTHREAD_MUTEX_INIT;
empty = PTHREAD_MUTEX_INIT;
Run Code Online (Sandbox Code Playgroud)
在使用者和制作者方法中,我是否只是通过说:
pthread_mutex_lock(&lock);
Run Code Online (Sandbox Code Playgroud)
和
pthread_cond_wait(&full, &lock);
Run Code Online (Sandbox Code Playgroud)
?
我的代码现在非常错误,所以我想在进一步调试之前至少确保我正确使用互斥锁和条件.提前致谢!
Mic*_*urr 14
如果要使用PTHREAD_XXX_INITIALIZER宏,则应在变量声明中使用它们.也PTHREAD_COND_INITIALIZER用于条件变量:
// Locks & Condition Variables
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; // Lock shared resources among theads
pthread_cond_t full = PTHREAD_COND_INITIALIZER; // Condition indicating queue is full
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // Condition indicating queue is empty
Run Code Online (Sandbox Code Playgroud)
稍后不要使用这些宏来初始化互斥锁或条件变量.如果以后需要执行此操作(例如,如果对象是动态分配的),请使用相应的init函数:
pthread_mutex_init( &lock, NULL);
pthread_cond_init( &full, NULL);
pthread_cond_init( &empty, NULL);
Run Code Online (Sandbox Code Playgroud)
要检查条件变量,必须使用循环以避免虚假解除阻塞,并且必须在以下情况下锁定互斥锁:
pthread_cond_wait()所以等待空的情况看起来像是:
pthread_mutex_lock(&lock);
while (!isEmpty) {
pthread_cond_wait( &lock, &empty);
}
// isEmpty is non-zero and the lock is held
Run Code Online (Sandbox Code Playgroud)
无论什么东西都是空的,可能看起来像:
pthread_mutex_lock(&lock);
// ...
// we have emptied the queue while holding the lock
isEmpty = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&empty);
Run Code Online (Sandbox Code Playgroud)