跳转至

并发

volatile

java 中的 volatile 既保证可见性,还具备内存屏障(防重排序)的作用。

编译器做的是静态乱序优化,CPU做的是动态乱序优化。

  • volatile关键字能够用来解决内存与I/O统一编址时,对硬件的即时访问。
// volatile 仅保证可见性,关键字表示每次内存数据读取都走主存(不走寄存器),避免静态乱序优化
volatile 
// volatile 等于编译器级别屏障,不能阻止CPU硬件级别导致的重排
#define barrier() __asm__ __volatile__("": : :"memory") 

// CPU屏障 CPU Barrior:函数表示内存屏障/禁止指令重排序,避免动态乱序优化
__sync_synchronize()
// C++11为内存屏障提供了专门的函数std::atomic_thread_fence

线程本地变量

Static memory local to a thread (线程局部静态变量),同时也可称之为线程特有数据(TSD: Thread-Specific Data)或者线程局部存储(TLS: Thread-Local Storage)。

#include <pthread.h>

// 确保无论有多少个线程调用多少次该函数,也只会执行一次由init所指向的由调用者定义的函数。
int pthread_once (pthread_once_t *once_control, void (*init) (void));

// Returns 0 on success, or a positive error number on error
int pthread_key_create (pthread_key_t *key, void (*destructor)(void *));

// Returns 0 on success, or a positive error number on error
int pthread_key_delete (pthread_key_t key);

// Returns 0 on success, or a positive error number on error
int pthread_setspecific (pthread_key_t key, const void *value);

// Returns pointer, or NULL if no thread-specific data is associated with key
void *pthread_getspecific (pthread_key_t key);

只要线程终止时与key关联的值不为NULL,则destructor所指的函数将会自动被调用。

智能的__thread的变量声明。