PTHREAD 互斥锁只是避免同时访问资源,还是做更多的事情?
Does a PTHREAD mutex only avoid simultaneous access to a resource, or it does anything more?
示例:
线程完成对共享变量的写入,然后解锁它,但继续使用该变量的值(不更改它)。
立即,另一个线程成功解锁()该互斥锁并读取共享变量。
根据我的(错误)理解,在这种情况下可能会发生一些事情:
在 WRITER 线程上:
编译器优化可以使写入仅在稍后发生
写入的值可以保留在当前CPU核心的缓存中,并在稍后刷新到内存
在 READER 话题上:
变量的值可能在 mutex lock() 之前被读取,并且由于一些编译器优化或者只是 CPU 缓存的正常工作,仍然被认为是 "already read from memory" 因此,不会再次从内存中获取。
因此,我们这里的值不是来自另一个线程的更新值。
pthread mutex lock/unlock() 函数是否执行任何代码 "flush" 当前缓存到内存以及确保当前线程与其他所有内容同步所需的任何其他内容(我不能想想除了缓存之外的任何其他东西),还是只是不需要(至少在所有已知的体系结构中)?
因为如果所有互斥量都只是名称的作用 - 互斥它的引用 - 那么,如果我有数千个线程处理相同的数据并且从我的算法的角度来看,我已经知道什么时候一个线程正在使用一个变量,没有其他线程会同时尝试使用它,这意味着我不需要互斥锁吗?或者我的代码是否会缺少在 PTHREAD 库中实现的一些低级和特定于体系结构的方法以避免上述问题?
pthreads 互斥锁定和解锁函数在 POSIX 中的函数列表中“...同步线程执行并同步相对于其他线程的内存”.所以是的,他们做的不仅仅是联锁执行。
他们是否需要向硬件发出额外的指令当然取决于架构(注意几乎每个现代 CPU 架构都会 至少 愉快地重新排序读取除非另有说明),但在每种情况下,这些函数都必须充当 "compiler barriers" - 也就是说,它们确保编译器不会重新排序,合并或省略内存访问,否则它会允许。
它是允许多个线程读取共享值而不互斥 - 你需要确保的是写入和读取线程都执行了一些同步功能之间写和读。例如,一种允许的情况是有许多读取线程延迟读取共享状态,直到它们通过屏障 (pthread_barrier_wait()
) 和一个写入线程在 之前执行对共享状态的所有写入 它通过了障碍。 Reader-writer locks (pthread_rwlock_*
) 也是围绕这个想法构建的。
示例: 线程完成对共享变量的写入,然后解锁它,但继续使用该变量的值(不更改它)。 立即,另一个线程成功解锁()该互斥锁并读取共享变量。
根据我的(错误)理解,在这种情况下可能会发生一些事情:
在 WRITER 线程上:
编译器优化可以使写入仅在稍后发生
写入的值可以保留在当前CPU核心的缓存中,并在稍后刷新到内存
在 READER 话题上:
变量的值可能在 mutex lock() 之前被读取,并且由于一些编译器优化或者只是 CPU 缓存的正常工作,仍然被认为是 "already read from memory" 因此,不会再次从内存中获取。
因此,我们这里的值不是来自另一个线程的更新值。
pthread mutex lock/unlock() 函数是否执行任何代码 "flush" 当前缓存到内存以及确保当前线程与其他所有内容同步所需的任何其他内容(我不能想想除了缓存之外的任何其他东西),还是只是不需要(至少在所有已知的体系结构中)?
因为如果所有互斥量都只是名称的作用 - 互斥它的引用 - 那么,如果我有数千个线程处理相同的数据并且从我的算法的角度来看,我已经知道什么时候一个线程正在使用一个变量,没有其他线程会同时尝试使用它,这意味着我不需要互斥锁吗?或者我的代码是否会缺少在 PTHREAD 库中实现的一些低级和特定于体系结构的方法以避免上述问题?
pthreads 互斥锁定和解锁函数在 POSIX 中的函数列表中“...同步线程执行并同步相对于其他线程的内存”.所以是的,他们做的不仅仅是联锁执行。
他们是否需要向硬件发出额外的指令当然取决于架构(注意几乎每个现代 CPU 架构都会 至少 愉快地重新排序读取除非另有说明),但在每种情况下,这些函数都必须充当 "compiler barriers" - 也就是说,它们确保编译器不会重新排序,合并或省略内存访问,否则它会允许。
它是允许多个线程读取共享值而不互斥 - 你需要确保的是写入和读取线程都执行了一些同步功能之间写和读。例如,一种允许的情况是有许多读取线程延迟读取共享状态,直到它们通过屏障 (pthread_barrier_wait()
) 和一个写入线程在 之前执行对共享状态的所有写入 它通过了障碍。 Reader-writer locks (pthread_rwlock_*
) 也是围绕这个想法构建的。