我有以下情况:
我有多个工作线程正在运行,它们都经过一段代码,并且允许它们同时进行。现在没有关键部分围绕这段代码,因为这些线程不需要它。
我有一个主线程,有时也想进入那段代码,但是当它进入时,其他工作线程都不应该使用那段代码。
天真的解决方案:用关键部分包围代码部分。但这会扼杀工作线程之间的大量并行性,这对我来说很重要。
有更好的解决方案吗?
我有以下情况:
我有多个工作线程正在运行,它们都经过一段代码,并且允许它们同时进行。现在没有关键部分围绕这段代码,因为这些线程不需要它。
我有一个主线程,有时也想进入那段代码,但是当它进入时,其他工作线程都不应该使用那段代码。
天真的解决方案:用关键部分包围代码部分。但这会扼杀工作线程之间的大量并行性,这对我来说很重要。
有更好的解决方案吗?
使用 RW 锁。RW 锁允许多个读取器和一个写入器。您的工作人员会在临界区开始时调用read-lock,而主线程会write-lock。
根据定义,当调用read-lock时,调用进程将等待任何写入线程完成。调用write-lock时,调用进程将等待任何读取或写入线程完成。
使用 POSIX 线程的示例:
pthread_rwlock_t lock;
/* worker threads */
void *do_work(void *args) {
for (int i = 0; i < 100; ++i) {
pthread_rwlock_rdlock(&lock);
// do some work...
pthread_rwlock_unlock(&lock);
sleep(1);
}
pthread_exit(0);
}
/* main thread */
int main(void) {
pthread_t workers[4];
pthread_rwlock_init(&lock);
int i;
// spawn workers...
for (i = 0; i < 4; ++i) {
pthread_create(workers[i]; NULL, do_worker, NULL);
}
for (i = 0; i < 100, ++i) {
pthread_rwlock_wrlock(&lock);
// do some work...
pthread_rwlock_unlock(&lock);
sleep(1);
}
return 0;
}
据我了解,您的工作线程是异步启动的。所以当主线程想要运行这段代码时,你必须确保没有工作线程在执行它。因此,您必须在主线程进入该代码段之前停止所有工作线程,然后允许它们再次进入该代码段。
这可以完成 - 使用 Grand Central Dispatch - 如果您的工作线程将被分配给一个调度组,请参阅https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference。 .html _
然后主线程可以将消息发送dispatch_group_wait
到这个调度组,等待所有工作线程离开这个代码段,执行它,然后重新排队工作线程。