2013-02-03 103 views
0

我有以下场景:多线程同步原语

我有多个工作线程运行,都经历了一段代码,并且他们被允许同时这样做。由于这些线程不需要关键部分,所以现在没有关键部分围绕这段代码。

我有一个主线程也是-occassionally-想要输入该代码段,但是当它的时候,其他工作线程都不应该使用该代码段。

天真的解决方案:用关键部分围绕代码部分。但是,这会消除工作线程之间的很多并行性,这对我来说很重要。

有没有更好的解决方案?

+0

请解释清楚你想达到什么目标,并提供你到目前为止的代码示例 –

回答

0

使用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; 
} 
+0

谢谢,这让我在路上。 –

-1

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

+0

给那位投下我答案的人:请问为什么?这不仅对我来说很重要(我想学点东西),而且对于阅读此贡献的其他人也是如此。 –