模板网站有利于优化,家装公司网站建设方案,做网站的几个必要步骤,临城网站在上一节的卖票程序中#xff0c;我们讲解了如何在多线程中保证临界资源的正确访问——使用互斥锁#xff0c;即
lock_guardmutex lock(mtx);
count;lock_guardmutex lock(mtx);
count--;
从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用-CSDN博客…在上一节的卖票程序中我们讲解了如何在多线程中保证临界资源的正确访问——使用互斥锁即
lock_guardmutex lock(mtx);
count;lock_guardmutex lock(mtx);
count--;
从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用-CSDN博客 但是互斥锁是比较重的临界区代码做的事情比较多它涉及到系统调用和上下文的切换在高并发的情况下可能会带来一定的性能影响。而原子操作通常在硬件层面实现其执行速度更快且不需要上下文的切换 因此当临界区仅仅只是一个变量而不是一段代码时使用原子类型的效率比互斥锁要高 以下示例
#includeiostream
#includethread
#includelist
#includeatomic
using namespace std;volatile atomic_bool isReady(false);
volatile atomic_int mycount(0);void task()
{while(!isReady){std::this_thread::yield();//线程让出cpu时间等待调度}for(int i0;i100;i){mycount;}
}int main()
{liststd::thread tlist;for(int i0;i9;i){tlist.push_back(thread(task));}isReadytrue;for(auto td:tlist){td.join();}coutmycountendl;return 0;
}
上述volatile关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器那么两个线程有可能一个使用内存中的变量一个使用寄存器中的变量这会造成程序的错误执行。
volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出而不是使用已经存在寄存器中的值