给定此 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.04
用ubuntu: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