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

相关推荐
Shadow(⊙o⊙)7 小时前
Linux网络——文件与网络的连接桥梁struct sock {
linux·运维·网络
新时代牛马7 小时前
Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证
linux·运维·服务器
sunoo-2297 小时前
【网络编程 + 数据库】select 与 epoll 核心区别详解 + SQLite 入门到 C 接口全攻略
linux·网络·数据库·vscode·学习·sqlite
zbyyd7 小时前
Linux 系统编程 :select/epoll 多路复用与 SQLite 数据库实战
linux·数据库·sqlite
Mortalbreeze7 小时前
深入理解 Linux IO 模型(二):多路复用——select
linux·运维·服务器·网络·tcp/ip
koi77u8 小时前
嵌入式学习———sqlite数据表
linux·数据库·学习·sqlite
笑梦无境8 小时前
nginx安装(5)
linux·运维·nginx
xx~t8 小时前
嵌入式——Linux软件编程——数据库
linux·c语言·数据库·oracle·sqlite
流浪0018 小时前
Linux系统篇26——通信(三)补:共享内存访问真的不进内核?
linux·运维·服务器
不会就选b8 小时前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器