有没有办法让它能够让 n 线程在其他线程没有锁定其他函数时运行某个函数?
我希望实现以下目标:
pthread_t threadID[10];
pthread_mutex_t blocking;
pthread_mutex_init(&blocking, NULL);
pthread_cond_t go;
pthread_cond_init(&go, NULL);
void * function1() {
pthread_mutex_lock(&blocking); // Only one thread at a time!
// Do some work
pthread_cond_broadcast(&go);
pthread_mutex_unlock(&blocking);
}
void * function2() {
pthread_cond_wait(&go, NULL); // Imagine 5 threads waiting here.
// Does some work too!
}
我想要的基本上是 n 线程运行function2,当没有线程在function1中运行时。
我不希望锁定function2,因为线程可以同时执行它而没有问题,所以我知道pthread_cond_wait(&go, NULL)
不起作用(即使NULL参数有点傻)。此外,广播将发出所有等待线程的信号,但只有其中一个线程将进入关键代码段。我的目标是用信号解锁所有线程,并允许所有这些线程执行代码。
我知道有一些方法可以在不进入线程锁定机制的情况下执行此操作(比如在function1中修改变量,而function2必须在允许线程向前移动之前检查其值),但我想知道是否有方法互斥和条件变量,而不是信号量。
答案 0 :(得分:1)
是的,这很容易做到。使用互斥锁来保护共享状态,在需要等待共享状态更改时使用条件变量,使用普通整数变量来跟踪共享状态。
当线程进入某个区域时,它应该:
当一个线程占据一个区域时,它应该:
就这么简单。