在此代码中,显示了使用互斥锁的示例。特别是,互斥量首先在之前声明main
:
pthread_mutex_t mutexsum;
互斥锁“保护”的特定变量dotstr.sum
位于全局结构中dotstr
:每个线程在获取a之后都在其上写入lock
。对应的代码是:
pthread_mutex_lock (&mutexsum);
dotstr.sum += mysum;
printf("Thread %ld did %d to %d: mysum=%f global sum=%f\n",offset,start,end,mysum,dotstr.sum);
pthread_mutex_unlock (&mutexsum);
我已经编译了代码,它显然可以工作,但是我不太了解互斥体。那么,程序如何知道“通用”互斥mutexsum
仅应用于dotstr.sum
变量?
还有许多其他全局变量可以锁定。为什么互斥锁mutexsum
和我要锁定的变量之间的代码中没有明确的关系dotstr.sum
?
(pthread)互斥锁未明确绑定到特定变量,它只是一种通用的锁定机制。您有责任确保对该变量进行的每个操作都正确地被锁定和解锁包围。
您的程序具有(n个隐式)合同,只有1个线程可以访问dotstr.sum
。互斥锁可确保只有1个线程可以在该互斥锁上锁定,从而帮助您强制执行该互斥锁,但这不会迫使您每次使用时都会对其进行锁定和解锁dotstr.sum
。
例如,尝试注释掉锁定和解锁行。该程序仍将编译并运行,但是结果可能并非您想要的那样。
您可以将互斥锁与任何内容相关联,例如从文件读取或写入。但是,您必须确保对要锁定的事物的所有访问都实际上已锁定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句