pthread条件等待c

时间:2016-10-23 04:04:21

标签: c multithreading pthreads

我不确定如何问这个问题,而不是举一个我正在尝试做的例子,所以这里有。假设我有线程A,B,C,D,E和F.我有一个名为 Car 的共享资源。 Car 可以容纳2个人,也就是线程。所以现在我要按照A-> F的时间顺序创建线程。但是,一次只能有2个线程使用 Car 。因此,在时间1,我们看到线程A和B正在使用 Car 。假设线程B正在离开 Car ,现在我们有一个开放点。这个点由线程C填充。依此类推,直到每个线程在 Car 中转弯。能够实现这一目标的最佳方法是什么?所有线程必须正在运行,并且一次只有2个可以使用共享资源,以防我没有说清楚。我想过以某种方式实现一个线程队列。这样,当一个人完成它可以发出下一个信号,但我不知道该怎么做。感谢您的帮助。

编辑:对不起,我没有说明接下来只有下面的字母可以进入 Car ,所以例如如果B离开了 Car 那么接下来只允许C进入 Car 。如果A在 Car 包含{A,C}时退出,那么应该通知D进入 Car ,所以现在 Car 包含{ D,C}等等,直到所有线程都有机会乘坐 Car

2 个答案:

答案 0 :(得分:0)

听起来您正在寻找的机制是semaphore

A semaphore is an integer whose value is never allowed to fall below
zero.  Two operations can be performed on semaphores: increment the
semaphore value by one (sem_post(3)); and decrement the semaphore
value by one (sem_wait(3)).  If the value of a semaphore is currently
zero, then a sem_wait(3) operation will block until the value becomes
greater than zero.

将信号量的初始值设置为2(在sem_init()调用中),并让每个线程在进入Car之前调用sem_wait(),并在下线后sem_post()汽车,你应该得到你想要的行为。

答案 1 :(得分:0)

您可以使用信号量,或者您可以使用计数器和条件变量来获得类似的效果。

在下面的示例中,nthreads是一个整数来跟踪 Car 中的线程数,mutexpthread_mutex_t来保护{ {1}},nthreadscond,用于在另一个线程离开 Car 时发信号等待线程。

所以要输入 Car ,每个线程都会使用:

pthread_cond_t

要离开 Car ,线程会使用:

pthread_mutex_lock(&mutex);
  while (nthreads >= 2)
    pthread_cond_wait(&cond, &mutex);
  nthreads++;
pthread_mutex_unlock(&mutex);

请注意,互斥锁可以保护pthread_mutex_lock(&mutex); nthreads--; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); ,而不是 Car ......它是保护 Car nthreads。另请注意,在解锁互斥锁之前会通知该情况以确保它不会被丢失,并且条件等待处于循环中,以防等待在nthreads计数仍然过高而过早中断的情况下。