线程(Thread)是操作系统能够进行运算调度的最小单位,它比进程更小,是进程内的一个执行单元,也是进程内的实际运作单位。一个线程可以执行某个程序段,或是在给定的数据集上运行一段程序。...返回值: 无返回值,跟进程⼀样,线程结束的时候无法返回到它的调用者(自身) ⼀个线程可以调⽤pthread_ cancel终止同⼀进程中的另⼀个线程。...线程封装 通过对线程创建、终止、等待、分离等函数的学习,我们就可以利用这些接口封装一个便于理解和使用的线程库。 ...,并使用模板,所以该成员变量可以是任意类型的数据给线程绑定的函数使用。...结语 线程就是一个执行流,一个进程内可以有多个线程。进程是划分资源的最小单位,而线程(Thread)是操作系统能够进行运算调度的最小单位。
这个函数里面有2个参数: pthread_t thread:需要进行等待的线程ID void **retval: 获取的返回信息 2.3 线程终止 牢记:main线程结束那么进程结束,所以一定要保证main...通过这个参数,可以看出来这是个很简单的接口,终止对应tid的线程。只要线程存在,并且知道tid , 就可以终止线程(可以自己终止自己)。线程终止的返回值是一个整数!...和传入参数音参数一样,我们也可以返回一个类对象来传递多个变量。...3.5 返璞归真 — 线程终止与线程分离 问题 7 :线程终止的返回值 我们来看看通过线程终止接口终止的线程返回值是什么样的: void *ThreadRun(void *args) { std...所以不能 join 一个分离的线程! 所以主线程就可以不管新线程,可以继续做自己的事情,不用阻塞在join! 但是注意:线程分离了,依然是同一个进程!一个线程出异常,会导致整个进程退出!
与 std::thread 相比,std::jthread 具有异常安全的线程终止流程,并且在大多数情况下可以替换它,只需很少或无需更改代码。...在我们进入细节之前,先说一说std::thread 的缺陷:std::jthread 使用的时候需要通过join()来完成等待线程结束,继续join()后语句的执行,或者调用detach()来让线程与当前线程分离...默认构造、分离或移动的 std::thread 不可联接。...3.1自动join() 我们先看一个std::thread的错误例子: #include #include thread> int main() { std:...与 nonInterruptable 不同的是 interruptable 获取一个 std::stop_token 并在步骤3中使用它来检查它是否被中断(即stoken.stop_requested(
pthread_self() 函数是 POSIX 线程库中的一个函数,用于获取当前线程的线程 ID(Thread ID)。...2.4线程退出 线程退出只有三种情况: 代码跑完了,结果是对的 代码跑完了,结果是错的 出现异常,代码没跑完 现在,我们已经能通过进程等待来获取代码执行结果,来确认是否是前两种情况 我们在一开始便点出一个结论...线程终止的方式: 线程函数结束 我们要使用pthread_exit()函数 pthread_exit()函数 pthread_exit() 函数是 POSIX 线程库中的一个函数,用于终止当前线程的执行并返回一个指定的值...调用 pthread_cancel() 函数并不会立即终止目标线程的执行,而是发送一个取消请求,目标线程可以在适当的时候响应取消请求并终止执行。...可以通过 pthread_testcancel() 函数来显式检查取消请求并做出响应。 2.5线程分离 线程默认都是joinable,需要等待的。
return: 当线程的 start 函数执行 return 时,线程正常终止,并返回指定的值,返回值可以通过 pthread_join() 获取。...pthread_exit(): 线程可以通过显式调用 pthread_exit() 来终止自身,pthread_exit() 允许线程在任何位置退出,返回的值也可以通过 pthread_join() 获取...如果调用失败,pthread_join() 将返回一个错误码。例如,ESRCH 表示指定的线程不存在,EINVAL 表示线程不可被 pthread_join() 回收,或者调用线程尝试等待自身终止。...在多线程程序中,任何线程都可以调用 pthread_join() 来等待另一个线程的结束。即使是非创建该线程的线程,也可以调用 pthread_join() 来等待它的终止。...分离状态是不可逆的,一旦线程被分离,就不能再通过 pthread_join() 获取该线程的返回状态或等待其结束。 以下例子中,创建了一个新线程,并通过 pthread_detach() 将其分离。
5 #include 6 using namespace std; 7 void* thread_routine(void* args) 8...主线程创建一批新线程 让主线程一次性创建十个新线程,并让创建的每个新线程都去执行start_routine函数,即start_routine这个函数会被重复进入。...2.获取线程ID——pthread_self 获取线程ID:1.创建线程时通过输出型参数获取;2.通过pthread_self接口函数获取。...4.线程终止——return、pthread_exit、pthread_cancel 一个线程,如果只是想终止该线程而不是整个进程,有三种做法: 直接从线程的函数结束,return就可以终止该线程; 线程可以自己调用...pthread_exit终止自己; 一个线程可以调用pthread_cancel来终止同一个进程中的另一个线程。
thread 线程以不同的方法终止,通过 pthread join 得到的终止状态是不同的,总结如下:(这个大家可以在先看了进程终止之后再看这里) 如果 thread 线程通过 return 返回,value...线程可以调用pthread_exit终止自己。 一个线程可以调用 pthread_cancel 终止同一进程中的另一个线程。...如果一个线程被分离,线程的工作状态就是分离状态,不需要被join,但依旧属于进程内部 int pthread_detach(pthread_t thread); 可以是线程组内其他线程对⽬标线程进⾏分离...Main thread finished. 主要功能: pthread_create():用于创建线程并启动执行。...使用场景 使用 thread>: 当你使用 C++11 或更高版本,并希望保持代码简单且跨平台时,thread> 是首选。 适合大多数常见的多线程编程任务。
2.3 移交线程归属权 thread掌握资源,像unique_ptr一样只能移动不能拷贝;此外当thread关联一个线程时向其移动赋值会导致程序终止。...支持移动操作的容器,例如vector,可以装载std::thread对象。 可以改进前文的thread_guard,使其支持构建并掌管线程,确保离开所在作用域前线程已完结。...()来获取可真正并发的线程数量,硬件信息无法获取时返回0。...可以通过thread的get_id()成员函数获取,也可以通过std::this_thread::get_id()获取当前线程ID。...以下是一些防范死锁的准则:1、如果已经持有锁,就不要获取第二个锁;确实需要获取多个锁时使用std::lock来一次性获取所有锁。2、一旦持锁,避免调用用户提供的程序接口避免嵌套锁。
值得注意,新线程引发段错误,OS向新线程所在的进程发送信号来终止,那么新线程和主线程赖以利用的资源将会被进程回收,以至于线程都被终止了。...(pthread_t thread);参数thread是要分离线程的线程id调用成功返回0,失败返回错误码可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离需要注意的是,joinable和分离是冲突的...程库NPTL提供了pthread_ self函数,可以获得线程自身的ID,且获取到的ID和pthread_create的第一个参数获取到的ID是同一个函数原型#include pthread_t...,即线程ID,这里与pthread_self获取的线程ID, pthread_create获取的第一个参数是一样的。...pthread_create(&pid_,nullptr,start_rontine,ctx);//因为调用函数start_rontine是类内函数,具有缺省参数this指针,在后续解包参数包会出问题,所以需要一个类来直接获取函数参数
一、线程创建 thread:这是一个指向pthread_t类型的指针,用于获取新创建线程的线程ID。在调用pthread_create后,这个指针会被设置为新线程的ID。...二、线程终止 终止线程的三种方法 在线程函数的内部使用return语句。 在线程函数的内部使用pthread_exit函数。 在主线程中使用pthread_cancel函数,可以回收指定的子线程。...2.3、注意点 不能用exit终止线程,因为exit是用来终止进程的,一旦exit执行了,那么整个进程也就退出了。...四、线程创建、终止、回收的例子 下面由主线程创建一批子线程,分配给子线程任务,子线程将结果封装起来并返回给主线程,主线程由此可以获取子线程的执行结果。...如果我们的主线程并不关心新线程的执行结果,我们可以将新线程设置为分离状态。所谓的分离只是进程的一种工作状态,在底层依旧数据共享,依旧属于同一个进程。
创建线程 下面的程序,我们可以用它来创建一个 POSIX 线程: #include pthread_create (thread, attr, start_routine, arg...) 在这里,pthread_create 创建一个新的线程,并让它可执行。...终止线程 使用下面的程序,我们可以用它来终止一个 POSIX 线程: #include pthread_exit (status) 在这里,pthread_exit 用于显式地退出一个线程...消息,并输出接收的参数,然后调用 pthread_exit() 终止线程。...之前一些编译器使用 C++ 11 的编译参数是 -std=c++11: g++ -std=c++11 test.cpp std::thread 默认构造函数,创建一个空的std::thread 执行对象
一,线程的创建与终止 线程是CPU最小的执行和调度单位。多个线程共享进程的资源。 创建线程比创建进程更快,开销更小。 创建线程的方法:pthread_create、std::thread。...pthread_create:传入的线程函数只有一个参数。 std::thread:传入的线程函数可以有任意数量的参数。...std::thread调用以后返回一个线程类,每创建一个线程类,就会在系统中启动一个线程,并利用这个线程类来管理线程。 线程类可以被移动,但是不可以被复制,可以调用move()来改变线程的所有权。...如果调用detach()分离线程,该线程结束后,线程资源会自动被系统回收。...3.使用条件变量来等待队列的更改。 4.当数据元素被添加到队列中时,条件变量会notify正在等待的线程,等待队列被更改的线程被唤醒并开始操作。
Linux中的线程 在Linux中,线程执行的是进程代码的一部分,也就是说,线程是进程的实体,可以看作是进程内的一个执行单元,我们将这些不同的执行单元称之为轻量级进程,不同线程之间可以通过共享内存来进行通信...返回值为类对象 主线程创建并启动了一个新的线程,通过 pthread_create 和 pthread_join 实现了线程的创建和等待。...在第一个for循环中,配一个新的字符数组name来存储线程名字,使用 snprintf 将线程名字格式化为 thread-i 的形式,调用 pthread_create 函数创建线程,传递线程名字作为参数...第二个for循环中,等待所有进程结束,使用 pthread_join 函数等待线程结束,获取线程返回的 name,并输出线程名字加上 “quit…”,删除线程名字的内存,以防止内存泄漏。...如果一个线程被创建,默认是需要joinable的,必须被join;如果一个线程被分离,线程的工作状态是分离状态,不能被join。 进程分离:一个线程依旧属于线程,但是不需要被主线程等待。
所以这两个虽然都是不同的执行流,但是是属于同一个进程内部的,我们可以使用ps -al来查看不同的线程信息 这个pid是对应进程的pid,这个LWP其实就是这个线程的id!!!...线程可以调用pthread_ exit终止自己。 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程 不能用exit终止线程,因为他是终止进程的!...返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身) pthread_ cancel函数 功能:取消一个执行中的线程 原型 int pthread_cancel(pthread_t...这就是分离线程 int pthread_detach(pthread_t thread); 可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离: pthread_detach(pthread_self...()); 被分离的线程不需要join,虽然线程已经被分离了,但是资源还是要共享,所以当主线程退出时,被分离的线程也是要退出的,底层也是同一个进程!
线程可以被创建并运行,也可以被终止,线程终止方式有很多种 比如 等待线程回调函数执行结束,次线程运行五秒后就结束了,然后被主线程中的 pthread_join 等待成功,次线程使命完成 void* threadRun...因为线程是进程的一部分,在进程中获取线程的错误信息等是无意义的,前面说过,如果一个线程因错误而被终止了,那么整个进程也就都活不了了,错误信息甄别交给父进程去完成,因此 pthread_join 就没必要关注线程退出时的具体状态了...答案是不可以,类似于 kill -9 无法终止 1 号进程 2.5.2、获取线程ID 线程 ID 是线程的唯一标识符,可以通过 pthread_self 获取当前线程的 ID #include 分离 Detach 线程在被创建时,默认属性都是 joinable 的,即主线程需要使用 pthread_join 来等待次线程退出,并对其进行资源释放;实际上我们可以把这一操作留给系统自动处理...,如此一来主线程就可以不必等待次线程,也就可以避免等待时阻塞了,这一操作叫做 线程分离 原生线程库 提供的线程分离接口是 pthread_detach #include int
线程库的后续操作,就是根据该线程ID来操作线程的 线程库NPTL提供了pthread_ self函数,可以获得线程自身的ID: pthread_t pthread_self(void); pthread_t...对于Linux目前实现的NPTL实现而言,pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址 3.4 线程终止 如果需要只终止某个线程而不终止整个进程,可以有三种方法: 从线程函数...,直到id为thread的线程终止。...thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下: 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值...); 可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离: pthread_detach(pthread_self()); joinable和分离是冲突的,一个线程不能既是joinable又是分离的
其实pthread库也是通过内核提供的系统调用(例如clone)来创建线程的,而内核会为每个线程创建系统全局唯一的“ID”来唯一标识这个线程。...这种方法对主线程不适用,从main函数return相当于调用exit .线程可以调用pthread_ exit终止自己。 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程。...如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。...如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数。...int pthread_detach(pthread_t thread); 可以是线程组内其他线程对⽬标线程进⾏分离,也可以是线程⾃⼰分离: pthread_detach(pthread_self())
,OS为了方便对物理内存做管理,将其划分成了若干个4KB大小的数据页,并设置了struct Page{}结构体,最后通过数组(struct Page mem[])的方式来管理这些数据页,这些数据页也被称为页框...:要等哪一个线程,线程的tid retval:输出型参数,用于获取线程函数返回时的退出结果(回调函数返回值不是void*么,这里用void**接收这个返回值) 返回值:在成功时,pthread_join...来完成资源回收,并且该等待是阻塞式的;如果我们不想等待线程,那么可以通分离线程的方式告知OS,在线程退出时让其自动释放线程资源;线程分离要通过调用pthread_detach来实现 这里要注意的是线程分离不能写在新线程中...,因为到底哪个线程是先被执行的这是无法确定的,所以很可能会发生主线程已经在等待了,但是新线程还没开始分离,这就会导致等待成功;但是线程分离会自动释放资源的,等待注定是要失败的,所以这是一种错误的写法,正确的写法应该是由主线程来分离...(n==0); return 0; } 3.线程终止 在进程终止的时候学了一个exit的系统调用,这个不能用来终止线程,因为它会导致整个进程终止 a.线程执行的函数return就算终止 b.使用
运行的时候发现只有一个进程。 终止之后就没有了。 然后用ps -al查看轻量级进程。...因为每一个线程都有自己独立的栈结构。 线程的终止 之前讲过一个exit的函数,这个函数是让进程终止,而不是线程,如果当前进程中任何一个执行流调用了exit函数,那么当前进程都会退出。...那么如何终止一个线程呢?函数中的return可以,还有一个函数可以: 参数默认设置为nullptr就可以了。...线程被等待的原因: 1.获取新线程退出的信息。 2.回收新线程对应PCB内核资源等,防止内存泄漏。...这种就是线程分离。
领取专属 10元无门槛券
手把手带您无忧上云