0

我有一个一般性的问题,可能很容易回答,但可能不是。我不知道。在我的代码中,我有四个线程在运行,所有线程都在通过一个列表工作,每次运行时每个线程都会弹出一个列表。下面是每个线程的代码,它们等待互斥锁解锁,自己锁定,做他们的事情,然后重新锁定互斥锁。

我的问题是:有没有办法将锁传递给特定线程?\

例如:如果我有四个线程运行这段代码(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;
}

谢谢!

更新 - 随机想法: 我只是有一个想法。是否有四个不同的函数,每个函数都接受一个特定的互斥锁,只由前一个函数释放?

4

1 回答 1

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 
};
于 2012-12-06T00:21:10.327 回答