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 排序功能對列表進行排序)
主站蜘蛛池模板: 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 杭州|上海贴标机-百科| 校园气象站_超声波气象站_农业气象站_雨量监测站_风途科技 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 模型公司_模型制作_沙盘模型报价-中国模型网 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 汽液过滤网厂家_安平县银锐丝网有限公司| 品牌广告服务平台,好排名,好流量,好生意。 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 质构仪_鱼糜弹性仪-上海腾拔仪器科技有限公司| (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 新疆系统集成_新疆系统集成公司_系统集成项目-新疆利成科技 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 |