C++中可使用pthread_t来创建线程,pthread_t是 POSIX 线程库中的数据类型,用于表示线程的标识符。它通常用于创建、管理和操作线程。在 C 或 C++ 中,你可以使用 pthread_t类型的变量来表示一个线程。
头文件:
#include
假设在线程中执行的不是死循环操作,那么创建线程的流程如下:
- #include
-
- void *thread_function(void *arg) {
- // 线程执行的代码
- return nullptr;
- }
-
- int main() {
- pthread_t thread_id;
- //创建线程
- int ret = pthread_create(&thread_id, NULL, thread_function, NULL);
- if (ret != 0) {
- // 处理线程创建失败的情况
- }
- // 等待线程结束
- pthread_join(thread_id, NULL);
- return 0;
- }
假设在线程中执行的是死循环操作,那么创建线程的流程如下:
- #include
-
- void *thread_function(void *arg) {
- // 线程执行的代码
- while(true) {
- //执行操作
- }
- return nullptr;
- }
-
- int main() {
- pthread_t thread_id;
- //创建线程
- int ret = pthread_create(&thread_id, NULL, thread_function, NULL);
- if (ret != 0) {
- // 处理线程创建失败的情况
- }
- // 将线程标记为“可分离”的状态,这意味着线程的资源在退出时会被自动回收,而不需要其他线程调用 pthread_join 来等待该线程的结束。这样可以避免线程资源的泄漏。
- pthread_detach(thread_id, NULL);
- return 0;
- }
以下具体介绍一下每个方法
目录
用于创建thread,返回值为0则代表创建成功,创建成功后,会更新thread_id的值
- pthread_t thread_id;
- int ret = pthread_create(&thread_id, NULL, thread_function, NULL);
- if (ret != 0) {
- // 处理线程创建失败的情况
- }
- #include
-
- int pthread_join(pthread_t thread, void **retval);
thread:要等待的线程的标识符。retval:用于存储被等待线程的返回值的地址。调用 pthread_join函数后,当前线程会阻塞直到指定的线程结束。如果指定的线程已经结束,那么 pthread_join会立即返回。在返回时,如果提供了 retval参数,则会将被等待线程的返回值存储到该参数指向的地址中。
通常情况下,使用 pthread_join 可以确保线程的结束顺序,以及在主线程中获取其他线程的返回值。
- #include
-
- void pthread_exit(void *retval);
retval:调用线程的返回值,可以是任意类型的指针。调用 pthread_exit 函数后,当前线程会立即终止执行,并将 retval 指向的值返回给其创建者。通常情况下,retval 可以是一个指向线程结束状态或者其他需要传递给创建者的信息的指针。
需要注意的是,调用 pthread_exit 并不会终止整个进程,只会终止调用线程的执行。如果主线程调用了 pthread_exit,那么整个进程会终止。
- #include
-
- int pthread_detach(pthread_t thread);
thread:要标记为可分离的线程的标识符。调用 pthread_detach 函数后,线程将被标记为“可分离”的状态,当线程退出时,其资源将自动被回收。这意味着其他线程无需调用 pthread_join 来等待该线程的结束。
通常情况下,如果你不需要等待一个线程的结束,或者不关心其返回值,可以将该线程标记为可分离的状态,以避免对 pthread_join 的调用。
- #include
-
- int pthread_cancel(pthread_t thread);
thread:要取消执行的线程的标识符。调用 pthread_cancel 函数后,会向指定的线程发送一个取消请求。被取消的线程可以选择是否响应该请求,以及如何响应。通常情况下,被取消的线程会在某个取消点检查取消请求,并根据需要执行清理工作然后退出。
需要注意的是,取消请求只是一个请求,不一定会导致线程立即被取消。被取消的线程可以通过设置取消状态为 PTHREAD_CANCEL_ENABLE 或 PTHREAD_CANCEL_DEFERRED 来决定是否接受取消请求,以及何时响应该请求。
另外,需要注意的是,pthread_cancel 并不会释放被取消线程所持有的资源,因此需要被取消的线程在取消时自行负责资源的清理。