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)。分离的线程依旧在原进程的地址空间中,可以继续访问进程资源。只不过主线程就不等待新线程了。

相关推荐
烛之武3 分钟前
Linux 命令速查表
linux·运维·服务器
进击的荆棘18 分钟前
Linux系统——进程概念(上)
linux·运维·进程
深念Y20 分钟前
Windows → WSL2 全面迁移:工具链、Docker、OpenCode
linux·运维·windows·docker·容器·环境·wsl
一池秋_29 分钟前
云笔记本,刷linux,天翼云笔记本rk3568
linux·运维·电脑
ltl9 小时前
存储性能建模:IOPS、吞吐与延迟
linux
刘某的Cloud11 小时前
ceph osd 导入导出 rbd volume 卷
linux·运维·ceph·volume
酸菜。13 小时前
dw_axi_dmac总结
linux
神奇霸王龙13 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
小绫网络安全16 小时前
Kali Linux渗透测试入门教程:从零搭建到实战攻防
linux·运维·服务器
allforgood16 小时前
控制启动过程
linux·运维·服务器