
线程同步
文章平均质量分 71
金色熊族
这个作者很懒,什么都没留下…
展开
-
理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
则b线程读取该原子变量后,不仅可以看到该原子变量的更新值(也就是a线程写入的值),还能看到a线程对该原子变量进行写入之前的所有其他的写操作的效果,不论是针对该原子变量的,还是针对其他变量的,也不论这些变量是不是原子变量,也不论使用何种内存序。里的实例3里面,我们看到,如果在一个线程里修改原子变量done,另一个线程读取done时,就会看到这个变化。这就是原子变量的可见性。1 a线程对某原子变量进行了写入操作,且使用了内存序memory_order_release,最重要的是红线标出的这句话。原创 2024-11-23 18:51:33 · 469 阅读 · 0 评论 -
理解原子变量之三:原子性与memory_order_relaxed
在一位C++大神 “高效程序员” 的公众号里,有这么一篇文章介绍原子变量《C++11开发中的Atomic原子操作》。里面有这么一段话:“...原子操作,基本都包含...三个方面...的语义:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)”。Atomicity翻译过来就是原子性,Visibility翻译过来就是可见性。本文在前面两篇文章的基础上,进一步讲述原子性的含义。原创 2024-11-23 14:55:34 · 363 阅读 · 0 评论 -
理解原子变量之二:从volatile到内存序-进一步的认识
实例1,2,3都是在vs2013下演示的。即使遵循相同的C++标准,不同的编译器对同一个标准的贯彻程度也不一样:有的编译器严格遵循标准,既不多做,也不少做;对照实例1,在不使用volatile的情况下,子线程workerThread对done的修改,没有影响到主线程的while(!编译器意识不到子线程也在改变done的取值,所以就认为done是常量,而不会在运行到while()时读取done的实际值,于是while(!反观实例2和3,子线程修改了done,主线程的运行随之受了影响,这就是可见。原创 2024-11-03 11:30:09 · 1063 阅读 · 0 评论 -
轻量锁与重量锁的思考
不论是linux还是windows,操作系统都提供轻量和重量两种锁。在windows上,CRITICAL_SECTION(临界区)是轻量的,Mutex是重量的;在linux上,futex是轻量的,而pthread_mutex_t是重量的。根据Jeff Preshing 在他的博客Always Use a Lightweight Mutex上的测试,windows上的临界区比mutex快~25倍。这是因为mutex的调用要进入内核,而临界区不会。当然,临界区的劣势是它不可以在进程之间协调。但是,只要你的程序是原创 2021-11-28 18:48:54 · 302 阅读 · 0 评论 -
利用std::async实现异步功能
c++ 11标准推出了多线程功能。其中我比较喜欢的是把async和future联合起来使用,实现异步功能。首先介绍async的使用办法输入参数第一个参数是启动线程的策略,有3个选项:std::launch::async, std::launch::deferred,以及std::launch::async| std::launch::deferred。std::launch::async选项表明,std::async被调用之后就将启动线程(尽管具体的启动时间点不确定,因为线程调用受操作系统支原创 2021-07-11 14:41:00 · 632 阅读 · 0 评论 -
多线程编程时应警惕release 编译模式
原理visual studio 提供两种模式来编译C++代码:debug和release.release 模式下,编译器会“优化”代码,把它认为可以简化的逻辑简化掉。比如说以下代码:void func(){ int i = 1; int j; j = i; while(i == j){}}编译器看到 i 赋值给 j,而且后来的语句里 i j...原创 2020-02-27 19:16:16 · 1174 阅读 · 0 评论 -
自己对互斥和同步的理解
拿下棋做例子。红棋走棋的时候,黑棋不能走,这是互斥;但是红棋走一步,下一步必须黑棋走,反之亦然,这是同步。原创 2016-11-19 15:32:51 · 695 阅读 · 0 评论