You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法使用<experimental/barrier>?C++多线程代码调用该组件报错

解决g++ 6.3.0下使用std::experimental::barrier的编译错误

嘿,我来帮你搞定这个问题!你在Ubuntu上用g++ 6.3.0尝试用std::experimental::barrier却报错,主要是因为这个版本的gcc对实验性C++并发组件的支持需要特定的编译条件,我给你拆解一下解决步骤:

1. 确认头文件正确

首先,std::experimental::barrier属于实验性特性,你必须包含专门的头文件:

#include <experimental/barrier>

别用普通的<barrier>,那是C20正式版std::barrier才用的头文件,g6.3.0还不支持。

2. 编译命令必须加这些参数

g++ 6.3.0不会默认启用实验性C++17特性,也不会自动链接实验性标准库,所以你的编译命令需要调整成这样:

g++ -std=c++1z -pthread -lstdc++experimental your_code.cpp -o your_program

逐个解释下这些参数:

  • -std=c++1z:启用C17的预览特性(g6.x时代还没正式叫C++17,所以用c++1z而不是c++17)
  • -pthread:多线程代码必须链接pthread库,否则会出现线程相关的链接错误
  • -lstdc++experimental:链接实验性标准库,因为std::experimental::barrier不在默认的libstdc++.so里

3. 示例可运行代码

给你写个简单的示例,确保你代码结构没问题:

#include <iostream>
#include <thread>
#include <experimental/barrier>

// 初始化屏障,等待3个线程到达
std::experimental::barrier sync_barrier(3);

void worker_thread(int thread_id) {
    std::cout << "线程" << thread_id << "已准备就绪,等待屏障同步\n";
    // 到达屏障并等待其他线程
    sync_barrier.arrive_and_wait();
    std::cout << "线程" << thread_id << "完成同步,继续执行\n";
}

int main() {
    std::thread t1(worker_thread, 1);
    std::thread t2(worker_thread, 2);
    std::thread t3(worker_thread, 3);

    t1.join();
    t2.join();
    t3.join();

    return 0;
}

用上面的编译命令编译这个代码,应该就能正常运行了。

额外建议:考虑升级编译器

如果你后续还有多线程开发需求,建议把gcc升级到9.x或更高版本——从gcc9开始,std::barrier正式成为C++20的标准特性,不需要再用experimental前缀,编译时只需要加-std=c++20 -pthread就能用,而且标准特性的稳定性和兼容性更好。

内容的提问来源于stack exchange,提问作者Tushar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:15:46