admin管理员组文章数量:1487745
【Linux】盘点<多线程控制>基本操作&演示:创建&中止&等待&分离
前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含:
一.POSIX线程库
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
- 要使用这些函数库,要通过引入头文件
include <pthread.h>
- 链接这些线程函数库时要使用编译器命令的“
-lpthread
”选项
gcc test.c -o test.o -lpthread
二.线程控制
1.pthread_t是什么类型
- pthread_t 的类型取决于实现。对于Linux目前实现的NPTL实现而言,pthread_t类型的线程ID,本质 就是一个进程地址空间上的一个地址。
2.创建线程:pthread_create
【1】基本语法
代码语言:javascript代码运行次数:0运行复制功能:创建一个新的线程
原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
参数
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数
返回值:
成功返回0;失败返回错误码
【2】示例演示
- 创建完后,新线程执行rout函数去了,传入参数是NULL;
- 主线程继续往下跑
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
void *rout(void *arg) {
int i;
for( ; ; ) {
printf("I'am thread 1\n");
sleep(1);
}
}
int main( void )
{
pthread_t tid;
int ret;
if ( (ret=pthread_create(&tid, NULL, rout, NULL)) != 0 ) {
fprintf(stderr, "pthread_create : %s\n", strerror(ret));
exit(EXIT_FAILURE);
}
int i;
for(; ; ) {
printf("I'am main thread\n");
sleep(1);
}
}
3.线程终止:pthread_exit&pthread_cancel
【1】基本语法
代码语言:javascript代码运行次数:0运行复制pthread_exit
功能:线程终止
原型
void pthread_exit(void *value_ptr);
参数
value_ptr:value_ptr不要指向一个局部变量。
返回值:
无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
pthread_cancel
功能:取消一个执行中的线程
原型
int pthread_cancel(pthread_t thread);
参数
thread:线程ID
返回值:
成功返回0;失败返回错误码
【2】示例演示
代码语言:javascript代码运行次数:0运行复制// 线程函数
void* thread_function(void* arg) {
int num_seconds = *((int*)arg);
printf("Thread is running. Will sleep for %d seconds.\n", num_seconds);
sleep(num_seconds); // 休眠一段时间以模拟工作
printf("Thread has finished execution.\n");
pthread_exit(NULL); // 退出线程
}
int main() {
pthread_t thread;
int num_seconds = 5;
int* arg = &num_seconds;
// 创建线程
if (pthread_create(&thread, NULL, thread_function, (void*)arg) != 0) {
perror("Failed to create thread");
exit(EXIT_FAILURE);
}
// 等待线程完成
if (pthread_join(thread, NULL) != 0) {
perror("Failed to join thread");
exit(EXIT_FAILURE);
}
printf("Main thread has finished.\n");
return 0;
}
4.线程等待:pthread_join
【1】为什么要进行线程等待
- 为什么需要线程等待?——主线程等待其他线程
- 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。
- 创建新的线程不会复用刚才退出线程的地址空间
【2】基本语法
代码语言:javascript代码运行次数:0运行复制功能:等待线程结束
原型
int pthread_join(pthread_t thread, void **value_ptr);
参数
thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值(没有返回值就填NULL)
返回值:
成功返回0;失败返回错误码
【3】示例演示
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void *thread1( void *arg )
{
printf("thread 1 returning ... \n");
int *p = (int*)malloc(sizeof(int));
*p = 1;
return (void*)p;
}
int main( void )
{
pthread_t tid;
void *ret;
pthread_create(&tid, NULL, thread1, NULL);
pthread_join(tid, &ret);
// pthread_join(tid, NULL);没有返回值就填NULL
printf("thread return, thread id %X, return code:%d\n", tid, *(int*)ret);
free(ret);
return 0;
}
5.线程分离:pthread_detach
【1】为什么要进行线程分离&线程joinable状态与分离状态
- 默认情况下,新创建的线程是 joinable 的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
- 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时, 自动释放线程资源 ,此时就是 分离状态
注意:
- joinable和分离是冲突的,一个线程不能既是joinable又是分离的
【2】基本语法
代码语言:javascript代码运行次数:0运行复制-- 线程组内其他线程对目标线程进行分离
int pthread_detach(pthread_t thread);
-- 线程内自己分离
pthread_detach(pthread_self());
【3】示例演示
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void *thread_run( void * arg )
{
pthread_detach(pthread_self());//线程内自己分离,进入分离状态
printf("%s\n", (char*)arg);
return NULL;
}
int main( void )
{
pthread_t tid;
if ( pthread_create(&tid, NULL, thread_run, "thread1 run...") != 0 ) {
printf("create thread error\n");
return 1;
}
//不需要调用 pthread_join
int ret = 0;
return ret;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-16,如有侵权请联系 cloudcommunity@tencent 删除linux多线程函数线程原型本文标签: Linux盘点<多线程控制>基本操作&演示创建&中止&等待&分离
版权声明:本文标题:【Linux】盘点<多线程控制>基本操作&演示:创建&中止&等待&分离 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1754763535a3179298.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论