Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading PTHREAD互斥体是只避免同时访问资源,还是做更多的事情?_Multithreading_Pthreads_Multiprocessing_Mutex - Fatal编程技术网

Multithreading PTHREAD互斥体是只避免同时访问资源,还是做更多的事情?

Multithreading PTHREAD互斥体是只避免同时访问资源,还是做更多的事情?,multithreading,pthreads,multiprocessing,mutex,Multithreading,Pthreads,Multiprocessing,Mutex,例如: 线程完成对共享变量的写入,然后解锁该变量,但继续使用该变量的值(不更改它)。 另一个线程立即成功解锁该互斥锁并读取共享变量 就我的(错误)理解而言,在这种情况下可能会发生一些事情: 在编写器线程上: 编译器优化可能会使写入只在稍后某个点发生 写入的值可以保留在当前CPU内核的缓存中,并在以后某个时候刷新到内存中 在读卡器线程上: 变量的值可能在mutex lock()之前读取,并且由于某些编译器优化或CPU缓存的正常工作,仍然被视为“已从内存读取”,因此不会再次从内存中获取 因此,

例如: 线程完成对共享变量的写入,然后解锁该变量,但继续使用该变量的值(不更改它)。 另一个线程立即成功解锁该互斥锁并读取共享变量

就我的(错误)理解而言,在这种情况下可能会发生一些事情:

在编写器线程上:

  • 编译器优化可能会使写入只在稍后某个点发生

  • 写入的值可以保留在当前CPU内核的缓存中,并在以后某个时候刷新到内存中

在读卡器线程上:

  • 变量的值可能在mutex lock()之前读取,并且由于某些编译器优化或CPU缓存的正常工作,仍然被视为“已从内存读取”,因此不会再次从内存中获取

  • 因此,这里的值不是来自另一个线程的更新值

pthread mutex lock/unlock()函数是否执行任何代码将当前缓存“刷新”到内存中,以及确保当前线程与其他所有内容同步所需的任何其他内容(我想不出除了缓存之外的任何内容),或者只是不需要它(至少在所有已知的体系结构中)


因为如果所有的互斥对象都是名称所做的-互斥到它的引用-那么,如果我有数千个线程处理相同的数据,并且从我的算法的角度来看,我已经知道当一个线程使用变量时,没有其他线程会尝试同时使用它,这意味着我不需要互斥对象?或者,我的代码是否会缺少一些在PTHREAD库中实现的低级和特定于体系结构的方法,以避免上述问题?

pthreads mutex lock和unlock函数是POSIX中的函数列表之一“…用于同步线程执行,还可以同步与其他线程相关的内存”。所以,是的,它们不仅仅是联锁执行

当然,它们是否需要向硬件发出额外指令取决于体系结构(注意,除非另有说明,否则几乎所有现代CPU体系结构都会愉快地相互重新排序读取),但在任何情况下,这些函数都必须充当“编译屏障”——即,它们确保编译器在允许重新排序、合并或省略内存访问的情况下不会重新排序、合并或省略内存访问

允许多个线程读取共享值,而无需相互排斥-您只需确保写入线程和读取线程在写入和读取之间执行一些同步功能。例如,一种允许的情况是,多个读取线程延迟读取共享状态,直到它们通过了屏障(
pthread\u barrier\u wait()
),而一个写入线程在通过屏障之前执行对共享状态的所有写入。读写器锁(
pthread\urwlock.*
)也是围绕这一理念构建的