互斥锁会锁定内存的哪一部分?(并行线程)

dre*_*eta 7 c++ multithreading pthreads

我在pthreads互斥锁上读到的所有文档都只说明互斥锁阻止多个线程访问共享内存,但是如何在程序中指定究竟是什么呢?它是程序中的所有全局变量,锁定和解锁函数之间访问的变量,还是......?我在pthreads上找到的所有内容,包括示例,都令人生气.

das*_*ght 16

互斥锁可防止多个线程访问共享内存

以上是不正确的陈述.互联网本身不会这样做.它允许您构建防止多个线程同时访问共享内存或其他资源的代码,但它本身不会锁定任何内容.

您可以构建一个使用互斥锁的程序,以防止多个线程同时执行特定的代码片段.如果这些代码片段碰巧正在访问共享内存区域,并且没有其他代码会尝试在不锁定互斥锁的情况下同时访问该区域,那么效果将是"锁定"该内存区域.


Jam*_*nze 8

互斥锁不会锁定内存,它会"锁定"执行路径的一部分,并同步内存(但在锁定和解锁时).保证的是,如果一个线程持有互斥锁,则没有其他线程可以获取它,并且任何尝试获取它的线程都将被阻塞,直到它被释放.

还保证在获取或释放互斥锁时将订购任何存储器访问(读或写); 换句话说,在保持互斥锁时所做的任何读取都将反映在获取互斥锁之前所做的任何更改(包括在不同线程中进行的更改),并且在保持互斥锁时所做的任何修改都将对所有其他人可见.最新发布互斥锁时的线程.(当然,其他线程必须确保其内存读取时查看最新值才能使其工作.)

有关更多信息,请务必阅读David Butenhof 编写的POSIX Threads编程.这是参考,并详细解释.