线程内存可见性

  1. 当线程调用pthread时,他所能看见的内存值也是它建立的线程能够看到的,任何在pthread_create之后向内存写入的数据可能不会被建立的线程看到,即使写操作发生在启动线程之前
  2. 当线程解锁互斥量时看到的内存数据,同样能被后来直接锁住(或通过等待条件变量锁住)相同互斥量的线程看到。同样,在解锁互斥量之后写入的数据不必被其他线程看见,即使写操作发生在其他线程锁住互斥量之前。
  3. 线程终止(或通过取消操作,或从启动函数中返回,或调用pthread_exit())时看到的内存数据,同样能够被链接该线程的其他线程(通过pthread_join())看到,终止后写入的数据不会被其他线程看到,即使写操作发生在连接之前
  4. 线程发信号或广播条件变量时看到的内存数据,同样可以被唤醒的其他线程看到,而在发信号或广播之后写入的数据不会被唤醒的线程看到,即使写操作发生在线程被唤醒之前。
  5. 线程寄存器变量不能被其他线程修改;线程分配的堆栈和堆空间是私有的,除非线程将指向该内存的指针传递给其他线程;任何放在register和auto变量中的数据可以再随后的某个时刻读取,就想完全同步的数据一样,每个线程自己是同步的,线程中共享的数据越少需要做的工作越多。
线程1                                   
pthread_mutex_lock(&mutex); 
a=1;
b=2;
pthread_mutex_unlock(&mutex);

线程2 
pthread_mutex_lock(&mutex);
local_a=a;
local_b=b;
pthread_mutex_unlock(&mutex);


从pthread_mutex_unlock()到pthread_mutex_lock()之间可视化
当线程b从pthread_mutex_lock()中返回时,他将和线程a调用
pthread_mutex_unlock()看到同样变量的值。即相应的1和2
线程1                                   
pthread_mutex_lock(&mutex); 
a=1;
pthread_mutex_unlock(&mutex);
b=2;

线程2 
pthread_mutex_lock(&mutex);
local_a=a;
local_b=b;
pthread_mutex_unlock(&mutex);


从pthread_mutex_unlock()到pthread_mutex_lock()之间可视化
当线程b从pthread_mutex_lock()中返回时,他将和线程a调用
pthread_mutex_unlock()看到同样变量的值。即local_a相应的1,
local_b的值,因为他是在解锁互斥量之后写入的。

猜你喜欢

转载自www.cnblogs.com/tianzeng/p/10685279.html