c++11并行编程

join()的作用是等待线程本对象销毁。

通过#include <cstdatomic>头文件中来使用对应于内置类型的原子类型定义,如atomic_llong.

也可以使用std::atomic<T> t;

c++11并行编程

c++11并行编程

atomic-integral-type和integral-type标识的是上表的原子类型,class-type则指自定义类型。读(load)写(store)交换(exchange)、比较交换(compare_exchange_weak +strong)、

atomic_flag(布尔类型且是无锁的(lock-free)也就是说线程对其访问不需要加锁,通过atomic_flag的成员test_and_set以及clear,可以实现一个自旋锁) ,test_and_set()是一种原子操作,用于在一个内存空间原子地写入新值并且返回旧值。

 

c++11中,原子类型只能从模板参数类型中进行构造,标准不允许原子类型进行拷贝构造、移动构造以及 使用operator=等。

c++11并行编程

 

c++11要想定义原子的自定义类型,则需要使用新关键字_Atomic来完成。

memory_order参数将有利于编译器进一步释放并行的潜在性能。c++11中保证顺序一致性:

编译器保证原子操作的指令间顺序不变。

处理器对原子操作的汇编指令执行顺讯不变。对于强顺序体系结构,无影响,但是对于弱类型的体系结构,在每次原子操作后加入内存栅栏。

c++11允许程序员委员自操作支付那个所谓的内存顺序: memory_order.

atomi扯<int> a {0};

atmomic <int> b {0};

int ValueSet(int) {

    int t = 1;

    a.store(t,, memory_order_relaxed);

    b.store(2, memory_order_relaxed);   //1参数为要写入值,而是一个枚举值,标识使用松散的内存模型,该指令可以任由编译器重排序或者由处理器乱排序执行。解除了先于发生的限制。

}

c++11并行编程

表中最后一个memory_order_seq_cst就位c++11中所有的atomic原子操作的默认值

原子存储操作(store):memory_order_relaxed、memory_order_release、memeory_order_seq_cst.

原子读操作(load):memory_order_relaxed、memory_order_consume、memory_order_acqiuire、memory_order_seq_cst。

RMW(read_modify_write):即一些需要同时读写的操作,memory_order_relaxed、memory_order_consume、memory_order_release、memory_order_acquire、memory_order_release,memory_order_acq_rel,memory_order_seq_cst。

 

TLS变量:每个线程将拥有独立这个变量的拷贝,一个线程中对这个变量的读写并不会影响另外一个线程中变量的值。

c++11中对TLS标准做出了规定:通过thread_local修饰符声明  int thread_local errCode;

 一旦声明一个变量为thred_local,其值将在线程开始时被初始化,而在线程结束时,该值也将不再有效。对变量&取地址,也是只能取到当前线程中的变量的地址。

 

c++中终止函数如terminate、abort、exit等。

terminate: 属于异常处理的一部分,没有被捕获的异常就会触发这个函数的调用,此外,noexcept如果抛出异常也会调用。诸如此类,非程序预期的行为都会可能导致terminate函数的调用。terminate函数在默认情况下 会调用abort函数,可以通过set_terminate函数来改变默认行为。二者都不会调用析构,

abort: 更加底层,默认情况下回向合乎POSIX标准的系统抛出一个信号:SIGABRT.最下策的终止,容易出现问题。

exit: "正常退出",会调用自动变量的析构函数,并且还会调用atexit注册的函数。跟main函数结束时的清理工作是一样的。如果代码中有很多类,这些类在对空间上分配了大量的零散内存,依次清理时会,只是标记未使用就可以了,但是实际需要释放析构的过程,是毫无意义的。

c++11 标准引入quick_exit函数,该函数并不执行析构函数而只是使程序终止。与exit同属正常退出。使用at_quick_exit注册的函数也可以在quick_exit时被调用。

c++11并行编程