线程间的内存可见性

1.当线程调用pthread_create()时,他所能看到的内存值也是他建立的线程能够看到的。任何调用pthread_create()之后向内存写入的数据,他可能不会被建立的线程看到,即使写操作发生在启动线程之前。

2.当线程解锁互斥量看到内存中的数据,同样也能被后来直接锁住(或等待条件变量锁住)相同的互斥量看到。同样,在解锁互斥量之后的数据不必被其他线程看见,即使写操作发生在其他线程锁住互斥量之前。

3.线程终止(或者通过取消,或者从启动函数中返回,或者调用pthread_exit()时看到内存的数据,同样能够被链接该线程的其他线程(通过pthread_join())当然,终止后写入的数据不会被链接线程看到,即使写操作     发生在链接线程之前。

4.线程发信号或广播条件变量时看到内存数据,同样可以被唤醒的其他线程看到。而发信号或广播该条件变量之后写入的数据不会被唤醒的其他线程看到,即使写操作发生在线程被唤醒之前。

线程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/9240502.html