Parallel processing 多线程同步原语

Parallel processing 多线程同步原语,parallel-processing,thread-safety,critical-section,Parallel Processing,Thread Safety,Critical Section,我有以下情况: 我有多个工作线程在运行,它们都经过特定的代码段,并且允许它们同时执行。由于这些线程不需要这段代码,所以现在没有关键部分围绕着这段代码 我有一个主线程,它有时也想进入这段代码,但当它进入时,其他工作线程都不应该使用这段代码 朴素的解决方案:用关键部分围绕代码部分。但这会破坏工作线程之间的大量并行性,这在我的例子中很重要 有更好的解决方案吗?使用RW锁。RW锁允许多个读卡器和一个写卡器。您的工作线程将在关键部分的开头调用readlock,主线程将写入lock 根据定义,调用读锁时,调

我有以下情况:

我有多个工作线程在运行,它们都经过特定的代码段,并且允许它们同时执行。由于这些线程不需要这段代码,所以现在没有关键部分围绕着这段代码

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

朴素的解决方案:用关键部分围绕代码部分。但这会破坏工作线程之间的大量并行性,这在我的例子中很重要


有更好的解决方案吗?

使用RW锁。RW锁允许多个读卡器和一个写卡器。您的工作线程将在关键部分的开头调用readlock,主线程将写入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完成此操作,请参阅。
然后,主线程可以将消息dispatch_group_wait发送到此dispatch group,等待所有工作线程离开此代码段,执行它,然后重新调用工作线程。

请清楚解释您试图实现的目标,并提供您所拥有的代码示例,这让我走上了正轨。对那个否决我答案的人说:你能告诉我为什么吗?这不仅对我很重要,我想学点东西,而且对其他阅读这篇文章的人也很重要。。。