我有一个可能很容易回答的一般性问题,但可能不是。我不确定。在我的代码中,我有四个线程正在运行,所有线程都在列表中工作,每次运行时都会弹出一段。下面是每个线程的代码,它们等待互斥锁解锁,自己锁定,执行它们的操作,然后重新锁定互斥锁。
我的问题是:有没有办法将锁传递给特定的帖子? \
例如:如果我有四个线程运行此代码(t1,t2,t3和t4)并且t1刚刚完成,是否有一种方法可以保证t1将锁定传递给t2,并且t2将通过锁到t3等?
void *consumer(void *ptr){
int i;
// Print the thread ID
printf("Consumer TID %lu\n", (unsigned long)gettid());
// While the list isn't empty
while (1){
// Wait for the mutex
pthread_mutex_lock(&mutex);
// When you get it...
// If the list is empty
if (the_list.empty()){
// Unlock the mutex
pthread_mutex_unlock(&mutex);
break;
}
// Otherwise remove an element from the list
the_list.pop_front();
// And unlock the mutex
pthread_mutex_unlock(&mutex);
}
return NULL;
}
谢谢!
更新 - 随机思考:我只是想了想。是否有四种不同的函数,每种函数都只接受前一个函数发布的特定互斥量?
答案 0 :(得分:3)
您与消费者的问题是即使列表变空也需要保持准备状态。
我之所以这么说是因为消费者可能会在第一个生产商到来之前准备就绪。在这种情况下,消费者会看到一个空列表并退出,因此不会消耗任何生成的元素。
所以我建议
pthread_mutex_lock(&mutex);
while(the_list.empty())
pthread_cond_wait(&produced, &mutex);
pthread_mutex_unlock(&mutex);
制作人将向你发出信号pthread_cond_signal(&produced)
。
我认为这也会对您的问题产生答案:您没有“通过锁定”,而是信号(等待信号 - 如果您我们对“通过锁定”感兴趣,你可以用3-4种不同的信号来做。)
至于锁:锁是按数据而不是每个线程。所以锁通常与数据一起存储。
struct threadsafe_data_t {
data_t data;
pthread_mutex_t mutex;
pthread_cond_t modified; // or produced or whatever
};