pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

多線程程序卡在優化模式但在 -O0 中正常運行

Multithreading program stuck in optimized mode but runs normally in -O0(多線程程序卡在優化模式但在 -O0 中正常運行)
本文介紹了多線程程序卡在優化模式但在 -O0 中正常運行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我寫了一個簡單的多線程程序如下:

I wrote a simple multithreading programs as follows:

static bool finished = false;

int func()
{
    size_t i = 0;
    while (!finished)
        ++i;
    return i;
}

int main()
{
    auto result=std::async(std::launch::async, func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    finished=true;
    std::cout<<"result ="<<result.get();
    std::cout<<"
main thread id="<<std::this_thread::get_id()<<std::endl;
}

它在Visual Studio-O0中在gcc中的調試模式下正常運行,并在1<后打印結果/code> 秒.但是在發布模式或-O1 -O2 -O3下它卡住了并且不打印任何東西.

It behaves normally in debug mode in Visual studio or -O0 in gcc and print out the result after 1 seconds. But it stuck and does not print anything in Release mode or -O1 -O2 -O3.

推薦答案

兩個線程,訪問一個非原子的、非保護的變量是 UB 這涉及finished.您可以制作 std::atomic 類型的 finished 來解決這個問題.

Two threads, accessing a non-atomic, non-guarded variable are U.B. This concerns finished. You could make finished of type std::atomic<bool> to fix this.

我的修復:

#include <iostream>
#include <future>
#include <atomic>

static std::atomic<bool> finished = false;

int func()
{
    size_t i = 0;
    while (!finished)
        ++i;
    return i;
}

int main()
{
    auto result=std::async(std::launch::async, func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    finished=true;
    std::cout<<"result ="<<result.get();
    std::cout<<"
main thread id="<<std::this_thread::get_id()<<std::endl;
}

輸出:

result =1023045342
main thread id=140147660588864

coliru 現場演示

有人可能會認為'這是一個 bool –大概有一點.這怎么可能是非原子的?(當我自己開始使用多線程時,我就這樣做了.)

Somebody may think 'It's a bool – probably one bit. How can this be non-atomic?' (I did when I started with multi-threading myself.)

但請注意,std::atomic 提供給您的不只是缺乏撕裂.它還使來自多個線程的并發讀+寫訪問得到明確定義,阻止編譯器假設重新讀取變量將始終看到相同的值.

But note that lack-of-tearing is not the only thing that std::atomic gives you. It also makes concurrent read+write access from multiple threads well-defined, stopping the compiler from assuming that re-reading the variable will always see the same value.

使 bool 不受保護、非原子會導致其他問題:

Making a bool unguarded, non-atomic can cause additional issues:

  • 編譯器可能會決定將變量優化為一個寄存器,甚至將 CSE 多次訪問優化為一個,并從循環中提升負載.
  • 可能會為 CPU 內核緩存該變量.(在現實生活中,CPU 具有一致的緩存.這不是一個真正的問題,但 C++ 標準足夠寬松,可以涵蓋非連貫共享內存上的假設 C++ 實現,其中 atomicmemory_order_relaxed 存儲/加載將工作,但 volatile 不會.為此使用 volatile 將是 UB,即使它在實際 C++ 實現中實際工作.)
  • The compiler might decide to optimize variable into a register or even CSE multiple accesses into one and hoist a load out of a loop.
  • The variable might be cached for a CPU core. (In real life, CPUs have coherent caches. This is not a real problem, but the C++ standard is loose enough to cover hypothetical C++ implementations on non-coherent shared memory where atomic<bool> with memory_order_relaxed store/load would work, but where volatile wouldn't. Using volatile for this would be UB, even though it works in practice on real C++ implementations.)

為了防止這種情況發生,必須明確告知編譯器不要這樣做.

To prevent this to happen, the compiler must be told explicitly not to do.

關于 volatile 與這個問題的潛在關系的不斷發展的討論讓我有點驚訝.因此,我想花掉我的兩分錢:

I'm a little bit surprised about the evolving discussion concerning the potential relation of volatile to this issue. Thus, I'd like to spent my two cents:

  • volatile 對線程有用
  • 誰害怕糟糕的優化編譯器?.

這篇關于多線程程序卡在優化模式但在 -O0 中正常運行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

What is the fastest way to transpose a matrix in C++?(在 C++ 中轉置矩陣的最快方法是什么?)
Sorting zipped (locked) containers in C++ using boost or the STL(使用 boost 或 STL 在 C++ 中對壓縮(鎖定)容器進行排序)
Rotating a point about another point (2D)(圍繞另一個點旋轉一個點 (2D))
Image Processing: Algorithm Improvement for #39;Coca-Cola Can#39; Recognition(圖像處理:Coca-Cola Can 識別的算法改進)
How do I construct an ISO 8601 datetime in C++?(如何在 C++ 中構建 ISO 8601 日期時間?)
Sort list using STL sort function(使用 STL 排序功能對列表進行排序)
主站蜘蛛池模板: UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | 北京签证代办_签证办理_商务签证_旅游签证_寰球签证网 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 数控走心机-双主轴走心机厂家-南京建克 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | 合肥办公室装修 - 合肥工装公司 - 天思装饰 | 模型公司_模型制作_沙盘模型报价-中国模型网 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 震动筛选机|震动分筛机|筛粉机|振筛机|振荡筛-振动筛分设备专业生产厂家高服机械 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 |