C++ 线程在 ubuntu 22.04 上失败

C++ 线程在 ubuntu 22.04 上失败

给定此 bug.cpp 文件:

#include <thread>
int main() {
  auto t = std::thread([] {});
  t.join();
  return 0;
}

还有这个docker容器:

FROM ubuntu:22.04
RUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-clean
RUN apt-get update -y
RUN apt-get install -y g++

使用以下命令编译示例:

#!/usr/bin/env sh
docker build -t test:0 -f Dockerfile .
docker run -u $(id -u):$(id -g) -v $(pwd):/src -w /src test:0 bash -c "g++ -pthread -o bug bug.cpp && ./bug"

失败:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted

ubuntu:22.04ubuntu:20.04和替换ubuntu:21.10确实有效,所以我的假设是 Ubuntu 22.04 处理的方式发生了一些变化pthreads

从 Ubuntu 21.10 到 22.04 发生了哪些变化,导致了这个问题,我该如何修复它?


PS:sed以上操作是必需的,因为 Ubuntu 22.04 中还有其他东西出现故障,导致无法在 docker 容器中安装任何软件包...

答案1

线程问题与所使用的 Docker 版本有关。22.04 中的较新 GLIBC 使用 CLONE3 系统调用,而早期版本的 Docker 中的默认 SECCOMP 配置文件中没有这个系统调用。请参阅相关帖子https://github.com/adoptium/containers/issues/215#issuecomment-1142046045

因此您需要升级到更高版本的 Docker,或者调整容器的 SECCOMP 配置文件。信息包含在上面的帖子中。

答案2

Ubuntu 20.04 附带g++(Ubuntu 9.4.0-1ubuntu1~20.04.1)9.4.0 默认情况下,我thread通过安装 g++ 11 解决了与模块类似的问题

当前版本:

g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

添加存储库:

sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test

安装 g++ 版本 11

sudo apt install -y g++-11

现在您可以通过检查 g++ 版本来验证安装是否成功完成:

g++ --version
g++ (Ubuntu 11.2.0-1ubuntu1~20.04.1) 11.4.2
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果上述方法不能解决您的问题,您可以完全删除 g++ 11 和相关依赖项,运行以下命令:

sudo apt purge --autoremove -y gcc-11

删除 GPG 密钥和存储库:

sudo rm -rf /etc/apt/trusted.gpg.d/ubuntu-toolchain-r_ubuntu_test.gpg
sudo rm -rf /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-focal.list

相关内容