2016-03-15 146 views
0

共享内存在多​​线程中使用时是否需要同步?以下是该场景。跨线程共享内存访问

  1. 使用Int数组创建的共享内存(在进程Pa中)。
  2. Pa的每个线程都有该数组的索引,并且会根据某些条件更新数组[index] 。
  3. 我们是否需要Mutex来同步Int数组访问?
  4. 假设有一个进程(Pb)尝试访问此Int数组。我需要 互斥量(线程)和信号量进程同步。

让我知道同样的意见。

回答

1

如果数组包含纯值类型和每个线程在阵列的一个不相交子集操作 - 这是说,每个线程有一个互斥组索引将被读/写或从 - 然后不,你不需要任何形式的同步。

数组本身只是一块内存。重要的是,没有两个线程试图读取或写入到不受保护的相同内存位置 - 他们可以愉快地读取和写入交错或相邻或任何其他不相交的位置,因为它们不会踩到彼此的脚趾,所以说话。

但是,如果有多个线程需要读取或写入数组中的相同索引,那么您绝对需要通过某种类型的同步来保护这些读写操作。例如,假设您有:

int ia[10]; 

和两个线程。如果你可以保证(无论如何)线程#1将只访问ia[0..4]和线程#2将只能访问ia[5..9]那么你很好。不过,如果他们都想阅读或写作,则需要采取措施来保护这些访问权限。

+0

取决于共享内存的OP含义。 True Posix共享内存的所有内容都是原子读写。 – SergeyA

+0

@SergeyA当然这是一个实现细节 - 我不认为C通常会保证这一点,不是吗?或者我错过了什么? –