在this代码中,显示了使用互斥锁的示例。特别是,互斥锁首先在main
:
pthread_mutex_t mutexsum;
要受保护的特定变量"通过互斥体在全局结构dotstr.sum
中是dotstr
:每个线程在获得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);
我已经编译了代码,它显然有效,但我不太了解互斥。那么,程序怎么能意识到" general"互斥mutexsum
仅适用于dotstr.sum
变量?
还有许多其他可以锁定的全局变量。为什么互斥体mutexsum
和我要锁定的变量dotstr.sum
之间的代码中没有明确的关系?
答案 0 :(得分:3)
(pthread)互斥锁未明确绑定到特定变量,它只是一种通用锁定机制。由您来确保该变量的每个操作都被锁定和解锁正确包围。
您的程序有一个(n隐式)合约,只有1个线程可以访问dotstr.sum
。互斥体通过确保只有一个线程可以锁定互斥锁来帮助您强制执行它,但每次使用dotstr.sum
执行某些操作时,它都不会强制您锁定和解锁它。
尝试,例如,评论锁和&解锁线。该程序仍将编译并运行,但结果可能不是您想要的结果。
您可以将互斥锁与任何内容相关联,例如从文件读取或写入。但是你必须确保对你要锁定的东西的每次访问都被锁定。