我有以下场景:多线程同步原语
我有多个工作线程运行,都经历了一段代码,并且他们被允许同时这样做。由于这些线程不需要关键部分,所以现在没有关键部分围绕这段代码。
我有一个主线程也是-occassionally-想要输入该代码段,但是当它的时候,其他工作线程都不应该使用该代码段。
天真的解决方案:用关键部分围绕代码部分。但是,这会消除工作线程之间的很多并行性,这对我来说很重要。
有没有更好的解决方案?
我有以下场景:多线程同步原语
我有多个工作线程运行,都经历了一段代码,并且他们被允许同时这样做。由于这些线程不需要关键部分,所以现在没有关键部分围绕这段代码。
我有一个主线程也是-occassionally-想要输入该代码段,但是当它的时候,其他工作线程都不应该使用该代码段。
天真的解决方案:用关键部分围绕代码部分。但是,这会消除工作线程之间的很多并行性,这对我来说很重要。
有没有更好的解决方案?
使用RW锁。 RW锁允许多个阅读器并且只有一个作者。您的工作人员将在临界区开始时拨打读锁,主线程将写锁。
根据定义,当调用读锁定时,调用进程将等待任何写入线程完成。当调用写锁定时,调用进程将等待任何读或写线程完成。
示例使用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
发送到此分派组,等待所有工作线程离开此代码部分,执行它,然后重新请求工作线程。
给那位投下我答案的人:请问为什么?这不仅对我来说很重要(我想学点东西),而且对于阅读此贡献的其他人也是如此。 –
请解释清楚你想达到什么目标,并提供你到目前为止的代码示例 –