我对mutex和pthreads有疑问。
如果有共享标志,请调用它(F1)。并且有多个线程。 但只有一个线程(T1)可以提升/停止该标志,所有其他线程(T2..Tn)只能读取或拉出状态。
当标志F1设置为新值时T1是否使用mutex_lock / mutex_unlock是否足够? 是否所有其他线程都使用mutex_lock / mutex_unlock,即使它们只是从F1读取状态?
Exemple1:
T1()
{
while(Running)
{
pthread_mutex_lock(&lock);
F1 = true;
pthread_mutex_unlock(&lock);
}
}
T2()
{
while(Running)
{
if(F1) {
/* Do something */
}
}
}
Exemple2:
T1()
{
while(Running)
{
pthread_mutex_lock(&lock);
F1 = true;
pthread_mutex_unlock(&lock);
}
}
T2()
{
while(Running)
{
pthread_mutex_lock(&lock);
if(F1) {
/* Do something */
}
pthread_mutex_unlock(&lock);
}
}
答案 0 :(得分:1)
您可以使用单作家多读者习语。
读:
pthread_rwlock_rdlock(&rwlock);
写作:
pthread_rwlock_wdlock(&rwlock);
如果您的用例与您发布的示例一样简单,您可以考虑使用涉及原子标记的无锁版本。
答案 1 :(得分:1)
在pthreads模型下,读者做也需要执行同步操作。这可以是您所描述的读者和作者中的pthread_mutex_lock()
/ pthread_mutex_unlock()
对,也可以是读者 - 作者锁定的metalfox's suggestion。