Linux线程控制

线程创建

第一个参数是输出型参数,表示线程id;第二个参数是线程属性,NULL为默认属性;第三个参数是返回值void*,参数void*的函数指针;第四个是传递的参数。

使用该库需要编译时加上-pthread,使用c++封装的线程库在Linux中也要加。成功返回值0,出错返回错误码。

线程等待

阻塞方式等待

第二个参数是返回值,指针变量。

使用案例:

cpp 复制代码
#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
void* newthread(void * s)
{
    int n = 5;
    while(n--)
    {
        cout<<static_cast<char*>(s)<<endl;
        sleep(1);
    }
    return (void*)666;
}
string PrintHex(pthread_t& id)
{
    char buf[64];
    snprintf(buf, sizeof(buf), "%lx", id);
    return buf;
}
int main()
{
    pthread_t id;
    int n = pthread_create(&id, nullptr, newthread, (void *)"syx 666");
    if(n!=0)
    {
        cerr << "create thread error" << endl;
        return 1;
    }
    cout << PrintHex(id) << endl;
    void *code = nullptr;
    n = pthread_join(id, &code);
    if(n==0)
    {
        cout << "wait success!ret:" <<(uint64_t)code<< endl;
    }
    return 0;
}

线程只考虑正确返回,如果异常了,整个进程就崩溃了。当然返回可以不只是内置类型,还可以是自定义类型的数据。

批量线程创建:

cpp 复制代码
#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
#include<vector>
void* Threadrun(void* args)
{
    string name = static_cast<char*>(args);
    int cnt = 5;
    while (cnt--)
    {
        cout << name << " is run!" << endl;
        sleep(1);
    }
    return args;
}
int main()
{
    vector<pthread_t> tids;
    int num = 3;
    for (int i = 0; i < num; i++)
    {
        pthread_t id;
        char* name=new char[128];
        snprintf(name,128,"thread-%d",i+1);
        pthread_create(&id, nullptr, Threadrun, name);
        tids.emplace_back(id);
    }

    for (auto i : tids)
    {
        char *name;
        pthread_join(i, (void**)&name);
        cout << name << " over!" << endl;
    }
    return 0;
}

线程终止

main函数结束表示进程结束,此时新线程会被迫结束,因此要保证主线程最后退出。如果子线程使用exit退出,那么整个进程也退出了,exit是专门用终止进程的。可以用return终止。

对此,库里有专门终止线程的函数:

类似于return;我们还有另一种:

这个会发请求给子线程让它取消,返回值是有符号整数。使用案例:

cpp 复制代码
#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
#include<vector>
void* Threadrun(void* args)
{
    string name = static_cast<char*>(args);
    int cnt = 100;
    while (cnt--)
    {
        cout << name << " is run!" << endl;
        sleep(1);
    }
    return args;
}
int main()
{
    vector<pthread_t> tids;
    int num = 3;
    for (int i = 0; i < num; i++)
    {
        pthread_t id;
        char* name=new char[128];
        snprintf(name,128,"thread-%d",i+1);
        pthread_create(&id, nullptr, Threadrun, name);
        tids.emplace_back(id);
    }

    for (auto i : tids)
    {
        pthread_cancel(i);
        void *ret;
        pthread_join(i, &ret);
        cout << (long long)ret  << endl;
        // void *name;
        // pthread_join(i, (void**)&name);
        // cout << name << " over!" << endl;
    
    }
    return 0;
}

运行:

线程分离

如果想让线程自己退出回收资源,不要打扰别的线程,Linux提供了这个库函数:

这个函数就叫做线程分离;一个线程创建默认是joinable(必须join);一个线程被分离,线程的工作状态分离状态,不能被join,但依旧属于进程内部,但是不需要等待。新线程出异常还是会影响所有线程。

使用案例:

cpp 复制代码
#include<iostream>
using namespace std;
#include<unistd.h>
#include<pthread.h>
#include<vector>
void* Threadrun(void* args)
{
    pthread_detach(pthread_self());
    string name = static_cast<char *>(args);
    int cnt = 1;
    while (cnt--)
    {
        cout << name << " is run!" << endl;
        sleep(1);
    }
    return args;
}
int main()
{
    vector<pthread_t> tids;
    int num = 3;
    for (int i = 0; i < num; i++)
    {
        pthread_t id;
        char* name=new char[128];
        snprintf(name,128,"thread-%d",i+1);
        pthread_create(&id, nullptr, Threadrun, name);
        tids.emplace_back(id);
    }
    sleep(5);

    return 0;
}
相关推荐
w***488227 分钟前
Linux安装redis
linux·运维·redis
python百炼成钢2 小时前
28.嵌入式 Linux LED 驱动开发实验
linux·运维·驱动开发
西风未眠4 小时前
高效编辑之vi/vim常用快捷键汇总
linux·编辑器·vim
_Stellar4 小时前
Linux 服务器管理 根目录文件夹权限设置 基于用户组实现安全共享
linux·服务器·安全
LUCIFER4 小时前
驱动开发:详细分析 DTB、DTS、DTSI、DTBO 的区别、用途及它们之间的关系
linux·服务器·驱动开发
liuyao_xianhui6 小时前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼6 小时前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui6 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
xu_yule7 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器
4t4run7 小时前
25、Linux 特殊权限
linux·运维