c++多线程问题detach和join

c++并发编程实战上说,必须在线程结束前调用detach或者jion。如果线程结束再去分离,会出问题。 我的疑问是这么看来的话,c++根本就没有保证安全啊,即便detach在线程运行后一句就立马调用,也不能保证这是在线程结束前调用的啊,在这一块儿c++11是怎么处理的

0

4个回答

join 也好 detach 也罢,其实只要在thread对象销毁前调用,就可以了。和线程的运行函数没有关系的。

1
wkk15903468980
wkk15903468980 茅塞顿开啊,又看了下书,是我搞错了。我把线程对象销毁当成线程结束了
2 年多之前 回复

join就会等待线程执行结束。会阻塞
detach,join的目的就是要你程序, 比如你程序需要退出了,那么最好是等待线程结束,而不是不管线程的执行。

0
wkk15903468980
wkk15903468980 回复oyljerry: 那书上说的必须在线程结束前调用join怎么解释
2 年多之前 回复
oyljerry
oyljerry 你这个是两个线程啊。当前线程运行到join的时候,如果另一个线程结束了。join就直接返回了。不用租塞。所以逻辑都是对的
2 年多之前 回复
wkk15903468980
wkk15903468980 嗯,正常使用我会,我主要是疑问c++是怎么保证这个detach或join是在线程结束前执行的,好像保证不了啊
2 年多之前 回复
0
wkk15903468980
wkk15903468980 好像并不是这个样子的啊,我也调试过,线程定义好了就开始运行了,并不是在join处开始~
2 年多之前 回复
feng1790291543
鱼弦 回复wkk15903468980: 你可以调试看看,会执行完join之后,才跑lambda表达式里面的逻辑的
2 年多之前 回复
wkk15903468980
wkk15903468980 用上“资源获取即初始化”方法,我的疑问更加凸显了。在这种方法里,线程启动后会执行他的g函数,那么这段时间里子线程的函数很可能已经运行完了。这之后才去执行析构,去join,不是明摆着犯错误吗?所以这个问题我想不明白啊
2 年多之前 回复

并不需要线程结束前join,线程先结束了,join就会直接返回。你可以看下面代码

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

void fn1()
{
    std::cout << "fn1" << std::endl;
    return;
}

int main() {
    // your code goes here
    std::thread t1(fn1);
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    std::cout << "begin join" << std::endl;
    t1.join();
    std::cout << "end join" << std::endl;
    return 0;
}
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++11多线程join()和detach()的理解
#include &amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;gt;rn#include &amp;amp;amp;amp;amp;lt;thread&amp;amp;amp;amp;amp;gt;rnusing namespace std;rnrnvoid func()rn{rn cout &amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;lt; &amp;amp;amp;amp;quot;hell
线程安全、C++多线程的管理(detach、join、get_id)
线程安全n线程安全函数:当一个函数被多个并发线程反复调用的时候,它的结果始终是正确的n一般线程不安全的情况,是由于同一个进程的不同线程共享进程内存空间中的全局/静态存储区和堆,如果一个函数中包含全局变量和静态变量,那么可能会线程不安全,导致程序错误。但是如果对全局变量和静态变量的操作只有读,没有修改的话,也可以将这个函数看做是线程安全的。nnC++多线程(C++11)n多线程demonC++11的...
C++11多线程(一)线程入口、传参、join()和detach()
1)锁住的东西越少,执行效率越高rn2)只读的数据,不需要互斥;又读又写的数据块,才需要使用互斥量rnunique_lock只能锁一个互斥量,一个互斥量只能上一个unique_lockrn只能转移,不能复制。rnadopt lockrn前提:互斥量已经加了锁rn作用:初始化一把锁rntry to lockrn前提:互斥量未加锁rn作用:初始化一把锁,尝试锁,不会阻塞rndefer lockrn前提:互斥量未加锁rn作用:...
避免僵尸线程:线程资源的回收与join、detach
#include &amp;lt;pthread.h&amp;gt;#include &amp;lt;stdio.h&amp;gt;void* __task(void*arg){ return (void*)0;}int main(int agrc, char**argv){ int i = 0; pthread_t pid = 0; int ret = 0; pthread_attr_t attr; for(i=0; i&amp;lt...
C++11多线程注意事项以及detach中的坑
多线程编程是必须要掌握的,以前多线程基本是靠系统API或者第三方库完成的,比如windows的API函数CreateThread,linux创建线程函数pthread_create,但是这样编写的代码不可移植,不能跨平台,比如windows的多线程程序拿到linux下是跑不起来的,相反也一样,很不方便,然而C++11语言本身支持多线程,和平台无关,下面就来简单认识多线程n# include&lt;...
c++11多线程编程
c++11多线程库的使用,主要介绍了thread类中的构造函数 join函数和detach函数的使用方式
python3对多线程join的理解
python3 对多线程join 的理解n多线程编程个人比较难理解,虽然 工作中用一直用多线程编程, 难免有时候也会遇到问题, 这里就简单谈一谈 线程里面join 如何使用的?n当然参考了别人的博客,如果有什么问题,请留言反馈, 一起交流.n这里所说的是 threading.Thread 这种方式 创建的多线程.n例如下面的代码,n有两个线程, 一个速度快, 一个速度慢n#!/usr/bin/e...
c++多线程问题detach和join
c++并发编程实战上说,必须在线程结束前调用detach或者jion。如果线程结束再去分离,会出问题。 我的疑问是这么看来的话,c++根本就没有保证安全啊,即便detach在线程运行后一句就立马调用,也不能保证这是在线程结束前调用的啊,在这一块儿c++11是怎么处理的
c++多线程编程:join()函数与detch()函数的区别。
join函数与detchnn在一个线程中,开了另一个线程去干另一件事,使用join函数后,原始线程会等待新线程执行结束之后,再去销毁线程对象。n这样有什么好处?----&amp;gt;因为它要等到新线程执行完,再销毁,线程对象,这样如果新线程使用了共享变量,等到新线程执行完再销毁这个线程对象,不会产生异常。如果不使用join,使用detch,那么新线程就会与原线程分离,如果原线程先执行完毕,销毁线程对象及...
C11 多线程编程(1)
在多核时代,如何让程序充分利用cpu是个非常重要的话题。在默认情况下,C++程序运行时只有一个主线程,入口是main()。 n为了提升程序的并发处理能力,经常需要在程序中创建多个线程。 n在C11之前,C++并没有在语言层面直接支持多线程,开发者只能调用操作系统提供的SDK API来编写。 n这带来的问题是,不同的操作系统提供的SDK以及线程控制能力并不相同,这严重影响到程序的可移植性。 n而C11
常见多线程面试题之Thread的join()方法
通过面试题——现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?来讲解Thread.join()的用法,同时对源码进行了分析。
linux进程退出,线程资源用pthread_detach释放
linux下,用pthread_create创建线程后,线程的默认状态为joinable,如果程序退出,线程没被join,则会有线程的资源没有被释放。n调用pthread_join可以,但是程序会再调用该函数后阻塞住。n替代的调用pthread_detach,该函数可立即返回,有2种方法。n1:子线程里调用:pthrad_detach(pthread_self());n2:父线程里调用:p
理解多线程中的join方法
join方法用得不多,当A线程执行到了B线程的join()方法时,A就会等待,等B线程都运行完,A线程才会执行。使用join()方法时,会产生异常。rnrn用一个小程序说明join方法的使用技巧:rnrnclass Demo implements Runnablern{rn public void run()rn {rn  for(int x=1; xrn  {rn       System.ou
[C++11]析构函数中std::thread::join()卡住无法退出
join()卡住分析n直接原因: 与main thread退出时候发生死锁。nmain结束时候 -->CRT locktable.lockn        n-->~n        n -->join等待其他线程退出n其他线程结束时候n->等待main释放CRT locktable.lock -->与main线程死锁
CSocket对象不能在线程之间传递
 nncsocket对象不能在线程之间传递,如果传递,就可能引发断言ASSERT(pState-&amp;gt;m_hSocketWindow != NULL);nncsocket对象不能直接在线程之间传递,如果确实需要这样的功能,就用Detach函数取出SOCKET句柄来传递,收到句柄的线程再Attach句柄到本地创建的csocket对象nn如下面分析:nnCSocket断言错误:ASSERT(pSta...
C++多线程join
void readNum(int &amp;amp;num)n{n int j = 0;n cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; &quot;---start &quot;&amp;lt;&amp;lt;endl;n for(int i = 0; i &amp;lt; 1000000; ++i)n {n j+=i;n }n cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; &quot; end &quot;&amp
多线程中join( )方法的使用
你好,多线程join()方法了解一下~~先写一个子线程public class MyThread extends Thread{n n public MyThread(String name){n super(name);n }n n @Overriden public void run(){n for(int i=0;i&amp;lt;=20;i++){n ...
用valgrind调试pthread_create引起的内存泄漏------顺便熟悉下线程的joinable和detached属性
       valgrind的安装和调试很简单, 之前博文多次介绍(如果是ubuntu, 直接apt安装更简单, 一条命令搞定)。 最近遇到一个让人颇为难解的内存泄漏问题, 下面我们来抽取核心逻辑, 简单来说下:       先看看这段程序:#include &amp;lt;stdio.h&amp;gt;n#include &amp;lt;stdlib.h&amp;gt;n#include &amp;lt;unistd.h&amp;gt;n#...
一个简单的例子理解线程的join、wait及 notify方法
例子:现假设有一块钟表对象,钟表有两个线程,一个是查询当前时间,另一个是将时间显示出来。需要显示出正确的时间。nn分析:这个题目看起来只是需要简单的实例化一个钟表,然后定义两个线程,并且执行就可以了。于是使用下面的代码:nnnimport java.text.SimpleDateFormat;nnpublic class Clock {n n private String currentTime;...
线程基础:多任务处理(13)——Fork/Join框架(解决排序问题)
之前文章讲解Fork/Join框架的基本使用时,所举的的例子是使用Fork/Join框架完成1-1000的整数累加。这个示例如果只是演示Fork/Join框架的使用,那还行,但这种例子和实际工作中所面对的问题还有一定差距。本篇文章我们使用Fork/Join框架解决一个实际问题,就是高效排序的问题。
关于线程的内存泄漏问题
线程在程序设计中占有很重要的地位,而关于线程的使用方法和注意事项也有很多,这篇文章主要讲讲如何创建一个线程并且让我们的程序避免内存泄露问题的出现。nn线程的创建很简单,使用pthread_create函数,但是要注意参数的问题。nn下面就一些例子说明线程的内存泄露问题。nn```n#include &quot;../common.h&quot; //包含一些函数所需要的头文件nnpthread_t ...
C++ 多线程之创建多线程CreateThread
一、为什么要写这篇博客一直对C++多线程一知半解,感觉没有实际进入过C++多线程的世界,因此想从头开始慢慢真正进入C++多线程,真正了解多线程。因为我也想了解Linux下的C++ 编程,因此我也会在Linux平台下进行编写代码并验证。文章里面会借鉴一些网上优秀的代码和讲解,但买一行代码我都会自己敲一遍,学习和借鉴是一起的,但代码必须是自己一行一行写的才行。这里的开头也是希望自己能记住自己的初衷!二、
python 多线程 join 的 细节问题 注意使用事项
threads=[]n f=[fast,slow]n l=len(f)n for i in range(l):n t=MyThread(f[i],(),str(i))n threads.append(t)n n for i in range(l):n threads[i].start()nn for i in range(l):n #passn threads[i].join()n p
java多线程---顺序打印ABC的三种实现---join方法
使用join方法,让三个线程之间存在等待关系n代码如下:npackage com.zcj.join;nnpublic class JoinTest {n public static void main(String[] args) {n ThreadA threadA = new ThreadA();n ThreadB threadB = new ThreadB(threadA);
java Fork Join框架及使用
java Fork Join框架及使用,java自带的多线程框架,来处理多线程的问题
JAVA多线程中join()方法的详细分析
虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像是t.join()方法会使所有线程都暂停并等待t的执行完毕。当然,这也是因为我对多线程中的各种方法和同步的概念都理解的不是很透彻。通过看别人的分析和自己的实践之后终于想明白了,详细解释一下希望能帮助到...
多线程pthread_join()的两种作用
pthread_join()函数原型:int pthread_join(pthread_t thread, void **retval);nargs:    pthread_t thread: 被连接线程的线程号    void **retval   : 指向一个指向被连接线程的返回码的指针的指针return:    线程连接的状态,0是成功,非0是失败当调用 pthread_join() 时,当...
Java多线程中join方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。rnt.join();      //使调用线程 t 在此之前执行完毕。rnt.join(1000);  //等待 t 线程,等待时间是1000毫秒rnrn rn先上一段JDK中代码:rnrn/**rn * Wa...
CountDownLatch和join两种方式实现多线程并行处理
上一篇博客主要介绍了如何使用Semaphore串行打印ABC,这一篇将介绍如何并行打印ABC,功能如下: n有三个线程,线程1打印A,线程2打印B,线程3打印C,这里假设是必须做完A、B、C,才能根据A、B、C的结果去处理D,其中A、B、C可以并行执行,互不影响。这种情况很常见,比如我们泡茶,需要烧开水、准备茶叶、清洗餐具,最后是泡茶,可以将烧开水、准备茶叶、清洗餐具看成事件A、B、C,将最后的泡茶
java多线程同步以及线程间通信详解&amp;amp;amp;消费者生产者模式&amp;amp;amp;死锁&amp;amp;amp;Thread.join()(多线程编程之二)
多线程系列教程:java多线程-概念&amp;amp;创建启动&amp;amp;中断&amp;amp;守护线程&amp;amp;优先级&amp;amp;线程状态(多线程编程之一)java多线程同步以及线程间通信详解&amp;amp;消费者生产者模式&amp;amp;死锁&amp;amp;Thread.join()(多线程编程之二)java&amp;amp;android线程池-Executor框架之ThreadPoolExcutor&amp;amp;ScheduledThre...
多线程之join方法
一.前言:nn       在很多情况下,我们都是通过主线程创建并启动子线程的,如果子线程中需要耗费大量的时间计算的话,主线程往往会比子线程先结束,这个时候就会导致有时候主线程想获取子线程计算之后的结果,但是却获取不到。这个时候,我们就可以通过join方法来解决这个问题。nn二.join方法的作用:nnjoin方法的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的...
多线程和并发(三)使用join方法让线程按顺序执行
一.线程的join方法作用nnjoin方法把指定的线程添加到当前线程中,可以不给参数直接thread.join(),也可以给一个时间参数,单位为毫秒thread.join(500)。事实上join方法是通过wait方法来实现的。比如线程A中加入了线程B.join方法,则线程A默认执行wait方法,释放资源进入等待状态,此时线程B获得资源,执行结束后释放资源,线程A重新获取自CPU,继续执行。由此实...
JAVA多线程 join() 方法详解及应用场景
在某些情况下,主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法了,方法join()的作用是等待线程对象呗销毁。rnpublic class Test {nn public static class MyThread extends Thread {n @Over
多线程Join方法
天意怜幽草,人间重晩晴 n如果同时有两个线程,线程A(主线程)和线程B。线程B的执行时间需要5秒,那么在线程A中调用线程B之后(并且让线程B执行完)则需要5秒,这时,你可以这样写nnnnA.sleep(5000); //让线程睡5秒nn但是,如果你不知道线程B需要执行多长时间,并且在A中需要使用到B中的结果,那么,这时你就可以使用join方法;下面是具体的例子;nnnnnpublic class...
Java多线程之join篇
       Java中多线程至关重要,其中有个叫做Thread.join()的方法,十分关键。这个方法具体有什么作用呢,它又是怎么工作的,有什么原理呢,让我们一起来看一下。1、Join的作用       Join方法的作用,其实就是表示一旦某个线程调用了join方法,那么就要一直运行到该线程运行结束,才会运行其他进程,我们可以有一个例子来对比一下。      1.1、不使用Joinpackage...
java多线程join()详解
n Thread的join方法是一个非常重要的方法。使用它的特性可以实现很多比较强大的功能。虽然在编码中很少去直接使用,但是在并发包中被大量使用,所以了解它的作用与实现是很有必要的。nnnnnpublic static void main(String[] args) {n Thread thread = new Thread(() -&amp;gt; {n try ...
多线程通信(四)join()方法的使用
        开发中常常会遇见这样的问题,主线程在运行的时候,需要一些子线程去进行相应的运算,如果主线程需要子线程提供一个处理后的数据,那么主线程就必须要等子线程运行完后才能继续执行。先看下面的这种情况影视作品的一个拍摄场景中,这次不是主角(主线程)的独角戏,他需要一个配角(子线程)来搭戏,但是配角还没来,主角只能等配角来了才能开始,要是配角没来,主角非要开始的话那这个场景的戏就乱了。publi...
python多线程中join的用法
python中多线程join是用来阻塞主线程的。 nnn看下面的例子:ndef fast():n print "in fast"n sleep(10)n print "done in fast"nnndef slow():n print "in slow"n sleep(15)n print "done in slow"n一个运行快,一个运行慢
多线程中的join方法——源码分析
join方法的作用是等待线程销毁,当主线程中调用了其他线程的join方法时,主线程需要等到该线程执行完毕才可以继续执行,示例如下:nnnnpublic class MyThread extends Threadn{n public void run()n {n tryn {n int value = (int)(Math.random(...
java多线程-join方法详解(附面试题)
本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java多线程学习指南 java 多线程学习笔记