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

相关推荐
2302_799525744 分钟前
【Hadoop】Hadoop集群安装中出现的问题
linux·hadoop
刘一说10 分钟前
Linux调试命令速查:Java/微服务必备
java·linux·微服务
枫の准大一21 分钟前
【Linux游记】基础指令篇
linux
ypf520832 分钟前
OrbStack 配置国内镜像加速
linux
Hello.Reader37 分钟前
一文通关 Proto3完整语法与工程实践
java·linux·数据库·proto3
Hello.Reader43 分钟前
一文吃透 Protobuf “Editions” 模式从概念、语法到迁移与实战
linux·服务器·网络·protobuf·editions
陌上花开缓缓归以1 小时前
linux ubi文件系统
linux
口嗨农民工1 小时前
exiftool 分析jpeg图片使用
linux
大明者省1 小时前
pycharm解释器使用anaconda建立的虚拟环境里面的python,无需系统里面安装python。
linux·python·pycharm
WillWolf_Wang2 小时前
Linux 编译 Android 版 QGroundControl 软件并运行到手机上
android·linux·智能手机