这篇文章主要围绕c++11多线程记录1--std::thread和c++static多线程展开,旨在为您提供一份详细的参考资料。我们将全面介绍c++11多线程记录1--std::thread的优缺点,
这篇文章主要围绕c++11多线程记录1 -- std::thread和c++ static 多线程展开,旨在为您提供一份详细的参考资料。我们将全面介绍c++11多线程记录1 -- std::thread的优缺点,解答c++ static 多线程的相关问题,同时也会为您带来c – CMake链接错误pthread:启用多线程以使用std :: thread:不允许操作、c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?、c++11 Enable multithreading to use std::thread: Op、C++11 std::threads vs posix 线程的实用方法。
本文目录一览:- c++11多线程记录1 -- std::thread(c++ static 多线程)
- c – CMake链接错误pthread:启用多线程以使用std :: thread:不允许操作
- c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?
- c++11 Enable multithreading to use std::thread: Op
- C++11 std::threads vs posix 线程
c++11多线程记录1 -- std::thread(c++ static 多线程)
启动一个线程
话不多说,直接上代码
void func(); int main() { std::thread t(func); //这里就开始启动线程了 return 0; } void func() { std::cout << "Hello," << std::this_thread::get_id() << std::endl; }
等待子线程结束
有时候开启一个子线程之后,父线程很快运行结束;
如果想要父线程做完自己的工作之后等待子线程运行完再结束
...... std::thread t(func); t.join(); ......
子线程分离
子线程有很多很多工作需要完成,父线程不想等待它,这时候可以用detach
...... std::thread t(func); t.detach();
子线程分离后相当于是一个后台线程,这时负责子线程资源回收什么的,是c++运行库而不是父线程了.
注意点
要确保线程运行时所用的资源不会被提前释放
在上面这个小例子里,main线程创建了一个t线程,然后调用t.detach();
如果t线程中使用到了main线程里的某些资源(记作resources),那么就有必要引起注意.
如果main线程工作很少;t线程工作繁重,需要运行很长时间;
当main线程结束时,resources会被释放,然而这时t线程中还需要用到这些resources.
这就是问题所在:####要确保线程运行时所用的资源不会被提前释放
detach和join两者只能用一次
不能调用了detach之后再调用join;也不能调用join之后再调用detach (测试的时候我就试了先用detach再用join,然后就死了,卡了好一会。。)
c – CMake链接错误pthread:启用多线程以使用std :: thread:不允许操作
C++ Threads,std::system_error – operation not permitted?
我正在使用完全相同的源代码并进行编译
g++ ../src/main.cpp -pthread -std=c++11
工作没有任何问题.
因为我想在更大的项目中使用线程,所以我必须使用CMake的线程.在搜索解决方案后,我发现了几个代码,例如:
cmake_minimum_required (VERSION 2.6) project (Test) add_deFinitions("-std=c++11") find_package (Threads) add_executable (main src/main.cpp) target_link_libraries (main ${CMAKE_THREAD_LIBS_INIT})
但对我而言,我总是这样做不起作用:
terminate called after throwing an instance of 'std::system_error' what(): Enable multithreading to use std::thread: Operation not permitted Aborted (core dumped)
我的错是什么?
CMake输出看起来很有希望:
-- The C compiler identification is GNU 4.8.2 -- The CXX compiler identification is GNU 4.8.2 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Looking for include file pthread.h -- Looking for include file pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Configuring done -- Generating done
解决方法
我现在正在使用GCC 5.4,有问题的cmake片段工作正常.
我刚刚面临同样的问题.我这样的最终cmakelist.txt文件,它的工作原理.
cmake_minimum_required (VERSION 2.6) project (Test) SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11 -pthread") find_package (Threads) add_executable (main src/main.cpp) target_link_libraries (main ${CMAKE_THREAD_LIBS_INIT})
c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?
我也知道技术的选择实际上并不是唯一的,因此可以使用另一种技术(再次,MPI和OpenMP).为什么它们被用于不同的效果但仍然使用相同的源(cpu)?
如果我根据每种技术编译一个具有并行性的C程序,那么(从操作系统和硬件的角度来看)会有什么不同?例如,OpenMP或std :: thread是否使用POSIX线程?如果是这样,C 11的线程如何在Windows上运行?或者这些技术中的每一种都通过汇编语言直接与cpu协同工作?
解决方法
Unix libc包含了许多有用功能的OS线程包(如互斥锁,cond vars等).通常这种系统库的外部接口是“POSIX线程”(函数名为pthread_ *):http://en.wikipedia.org/wiki/POSIX_Threads
Windows有自己的难以使用的线程API(WINAPI的CreateThread等).但是有一些围绕Windows API的包装器可以获得类似POSIX线程api的东西(例如mingw32和cygwin有这样的库;检查wikipedia section)
C 11 std :: thread,boost的boost :: thread只是围绕系统线程API的现代OS独立包装器.它们用于创建可在任何支持的平台上编译的可移植程序,而无需创建#ifdef地狱和/或围绕系统线程库编写自己的自定义包装器.如果您正在创建新程序,请考虑使用这种方式.
还有其他几种穿线包装纸,例如包含在QT或GTK等图形库中.
OpenMP实现具有内部支持库(例如,gcc具有libgomp),其使用系统/ libc线程API,例如libgomp使用POSIX线程.一些实现还可以包括经由组件的用户空间线程切换(M:N线程模型).
MPI里面没有线程库. MPI用于创建多个进程并在它们之间建立通信.但是当MPI用于多线程程序时,它将使用一些线程API来进行同步.例如,MPICH将在unix上使用pthread.
c++11 Enable multithreading to use std::thread: Op
gcc4.6 以后对于 ld 自动加上了 as-needed 选项。所以编译选项应该变成:
g++ -Wl,--no-as-needed -std=c++11 -pthread a.cpp
这样就没有问题了!
C++11 std::threads vs posix 线程
为什么在实践中我应该更喜欢一个或另一个?std::thread
除了是一个类之外,还有什么技术差异?
答案1
小编典典如果您想在许多平台上运行代码,请选择 Posix Threads。它们几乎随处可见,并且非常成熟。另一方面,如果您只使用
Linux/gccstd::thread
则完全没问题——它具有更高的抽象级别、非常好的接口并且可以与其他 C++11 类很好地配合使用。
std::thread
不幸的是,即使 C11 似乎可用,C11类也不能(还)在每个平台上可靠地工作。例如,在原生
Androidstd::thread
或 Win64 中,它只是无法正常工作或存在严重的性能瓶颈(截至 2012 年)。
一个很好的替代品是boost::thread
-
它与(实际上它来自同一作者)非常相似std::thread
并且工作可靠,但是,当然,它引入了来自第三方库的另一个依赖项。
编辑:截至 2017 年,std::thread
主要适用于原生 Android。一些类,如std::timed_mutex
仍未实现。
今天的关于c++11多线程记录1 -- std::thread和c++ static 多线程的分享已经结束,谢谢您的关注,如果想了解更多关于c – CMake链接错误pthread:启用多线程以使用std :: thread:不允许操作、c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?、c++11 Enable multithreading to use std::thread: Op、C++11 std::threads vs posix 线程的相关知识,请在本站进行查询。
本文标签: