当其他线程没有执行时运行多个线程?

时间:2016-04-30 23:58:15

标签: c multithreading concurrency

有没有办法让它能够让 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必须在允许线程向前移动之前检查其值),但我想知道是否有方法互斥和条件变量,而不是信号量。

1 个答案:

答案 0 :(得分:1)

是的,这很容易做到。使用互斥锁来保护共享状态,在需要等待共享状态更改时使用条件变量,使用普通整数变量来跟踪共享状态。

当线程进入某个区域时,它应该:

  1. 获取互斥锁。
  2. 检查是否允许运行该区域。虽然不允许,但在释放互斥锁时阻止条件变量。
  3. 增加该区域中的线程数。
  4. 释放互斥锁。
  5. 当一个线程占据一个区域时,它应该:

    1. 获取互斥锁。
    2. 减少该区域中的线程数。
    3. 如果计数的更改可能允许线程进行,则广播条件变量。
    4. 释放互斥锁。
    5. 就这么简单。