0

我有以下情况:

我有多个工作线程正在运行,它们都经过一段代码,并且允许它们同时进行。现在没有关键部分围绕这段代码,因为这些线程不需要它。

我有一个主线程,有时也想进入那段代码,但是当它进入时,其他工作线程都不应该使用那段代码。

天真的解决方案:用关键部分包围代码部分。但这会扼杀工作线程之间的大量并行性,这对我来说很重要。

有更好的解决方案吗?

4

2 回答 2

0

使用 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;
}
于 2013-02-03T18:33:45.043 回答
-1

据我了解,您的工作线程是异步启动的。所以当主线程想要运行这段代码时,你必须确保没有工作线程在执行它。因此,您必须在主线程进入该代码段之前停止所有工作线程,然后允许它们再次进入该代码段。
这可以完成 - 使用 Grand Central Dispatch - 如果您的工作线程将被分配给一个调度组,请参阅https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference。 .html _
然后主线程可以将消息发送dispatch_group_wait到这个调度组,等待所有工作线程离开这个代码段,执行它,然后重新排队工作线程。

于 2013-02-03T20:40:37.693 回答