GVKun编程网logo

c++11多线程记录1 -- std::thread(c++ static 多线程)

3

这篇文章主要围绕c++11多线程记录1--std::thread和c++static多线程展开,旨在为您提供一份详细的参考资料。我们将全面介绍c++11多线程记录1--std::thread的优缺点,

这篇文章主要围绕c++11多线程记录1 -- std::threadc++ 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++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 – 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如何关联?

c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?

有几种方法可以实现多线程. std :: thread最终由C 11标准引入,但boost :: thread可以有效地使用.每种技术都有特定的语法和内容,但是 – 粗略地 – 用于cpu并行编程.但它们有不同的效果.我知道,例如,MPI和OpenMP用于不同的内存模型.

我也知道技术的选择实际上并不是唯一的,因此可以使用另一种技术(再次,MPI和OpenMP).为什么它们被用于不同的效果但仍然使用相同的源(cpu)?

如果我根据每种技术编译一个具有并行性的C程序,那么(从操作系统和硬件的角度来看)会有什么不同?例如,OpenMP或std :: thread是否使用POSIX线程?如果是这样,C 11的线程如何在Windows上运行?或者这些技术中的每一种都通过汇编语言直接与cpu协同工作?

解决方法

OS提供线程(syscalls用于创建新线程;调度服务).

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

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 线程

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::threadc++ 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 线程的相关知识,请在本站进行查询。

本文标签: