Linux线程控制

POSIX库

•与线程有关的函数构成了⼀个完整的系列,绝⼤多数函数的名字都是以"pthread_"打头的

• 要使⽤这些函数库,要通过引⼊头⽂ <pthread.h>

• 链接这些线程函数库时要使⽤编译器命令的"-lpthread"选项

创建线程:pthread_create

功能:创建⼀个新的线程原型:

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;失败返回错误码

cpp 复制代码
#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
using namespace std;

void* threadrun(void* args)
{
    string name=(const char*)args;
    while(1)
    {
        cout<<"我是新线程name:"<<name<<endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadrun,(void*)"thread-1");

    while(1)
    {
        cout<<"我是主线程"<<endl;
        sleep(1);
    }
    return 0;
}

使用命令:ps -aL | head -1 && ps -aL | grep mythread 查看线程ID和进程PID

PID LWP TTY TIME CMD

2711838 2711838 pts/235 00:00:00 mythread

2711838 2711839 pts/235 00:00:00 mythread

1.可以看到这两个线程拥有同一个进程PID因为这两个线程是在同一个进程中的。

2.LWP跟PID一样的那个线程是主线程。

3.在Linux中每一个线程(而不是进程)都又自己对应的task_struct,而task_struct中包含又pid_t pid; pid_t lwp。CPU在进行调度时看的实际上是LWP而不是PID。因为在Linux中都是轻量级进程(LWP)。事实上在Linux系统中不存在真正意义上的线程,线程这个概念实际上就是轻量级进程,所以Linux只有提供轻量级进程的系统调用。(例如:vfork)我们上面所讲的pthread.h是第三方库。

4.信号是给进程发的,而不是给线程发的,这就意味着给信号在一个进程中是线程共享的。这也意味着如果有一个线程崩溃那么整个进程就会退出。

5.c++11的多线程,在Linux下,本质是封装了pthread库;在windows下封装了windows创建线程的接口。

线程终止

1,线程的入口函数return就是线程终止了

2.线程不能用exit()来终止,因为exit是用来终止进程的!!!任意一个线程在代码中调用exit都会使整个进程退出

3.void pthread_exit(void* retval)==return (void*)(retval)

4.int pthread_cancel(pthread_t thread)用于在主线程中取消新线程thread。线程如果被取消,那么其推出结果位-1(也就是PTHREAD_CANCELED)。

在主线程进行pthread_joi(tid,&ret)拿到的返回值就是线程退出时的返回值,存入到ret中。默认线程的执行是无异常的。

如果主先线程不想关心新线程了,也就是不想再阻塞回收新线程怎么办?讲新线程设置为分离状态(!joinable or detach)。分离的线程依旧在原进程的地址空间中,可以继续访问进程资源。只不过主线程就不等待新线程了。

相关推荐
艾莉丝努力练剑4 小时前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
崇山峻岭之间4 小时前
Keil5输出hex转换为bin的设置
linux·运维·服务器
谷雪_6585 小时前
Linux 网络命名空间:从内核原理到企业级容器网络架构全景实战
linux·网络·架构
qq_163135756 小时前
Linux 【03- chgrp命令超详细教程】
linux
CodeStats6 小时前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go
我会尽全力 乐观而坚强7 小时前
MySQL库与表的操作
linux·数据库·mysql
着迷不白7 小时前
Linux 磁盘管理完全指南:分区、文件系统、挂载与 LVM 实战
linux·运维·服务器
山川而川-R7 小时前
LangChain
linux·运维·服务器
QH_ShareHub7 小时前
Linux 根目录结构详解
linux·运维·服务器
郝学胜-神的一滴8 小时前
CMake 038:OBJECT目标复用编译+Linux动态库版本自动化管理
linux·c++·程序人生·软件工程·软件构建·cmake·工程配置