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 小时前
Linux —— 基础开发工具2
linux·运维·服务器
秋深枫叶红4 小时前
嵌入式第二十三篇——数据结构基本概念
linux·数据结构·学习·算法
proware4 小时前
linux串口驱动之五一级接收缓存同步
linux·工作队列·smp_load
Bruce_Liuxiaowei4 小时前
Linux 内存获取方法详解
linux·运维·网络安全
源梦想4 小时前
英雄无敌动作冒险网页小游戏Linux部署演示
linux·运维·服务器
XH-hui4 小时前
【打靶日记】群内靶机 Creds
linux·网络安全
liulilittle4 小时前
C++ 计算当前时区偏移量秒数(GMT/UNIX偏移量)
linux·c++·unix
Ghost Face...4 小时前
Linux V4L2驱动架构与实现详解
linux·运维·架构
再睡一夏就好4 小时前
深入理解Linux程序加载:从ELF文件到进程地址空间的完整旅程
linux·运维·服务器·c++·学习·elf
执笔者5484 小时前
网络编程:socket编程与两个简单的UdpServer练习
linux·服务器·网络·学习