我不确定如何问这个问题,而不是举一个我正在尝试做的例子,所以这里有。假设我有线程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 。
答案 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 中的线程数,mutex
是pthread_mutex_t
来保护{ {1}},nthreads
是cond
,用于在另一个线程离开 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
计数仍然过高而过早中断的情况下。