自学内容网 自学内容网

【Linux】线程控制

目录

创建线程

pthread_create

终止线程

pthread_exit

return 自动返回

等待线程

pthread_join


创建线程

pthread_create

参数:

thread:返回线程ID

attr:设置线程的属性,attrNULL表示使用默认属性

start_routine:是个返回值和参数都为void*的函数的地址,线程启动后要执行的函数

arg: 传给线程启动函数的参数
返回值:
成功返回 0 ;失败返回对应的错误码

终止线程

如果一个进程中的线程掉执行时发生错误异常导致线程终止退出,比如解引用空指针、除0错误都会时线程异常终止,这会导致整个进程也随之终止!

如果需要只终止某个线程而不终止整个进程 , 可以有三种方法 :
1. 从线程函数 return 。这种方法对主线程不适用 , main 函数 return 相当于调用 exit
2. 线程可以调用 pthread_ exit 终止自己。
3. 一个线程可以调用 pthread_ cancel 终止同一进程中的另一个线程。
pthread_exit

 参数:

注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

return 自动返回

等待线程

线程等待和进程等待的目的基本是一样的!目的是:1.释放已经终止的线程的空间。2.得到线程的执行任务的情况即线程启动函数的返回值(一般通过该值判断线程执行任务的情况)。

pthread_join

 

参数:

retval:指向一个指针,即线程启动函数的返回值。

返回值:

成功返回0;失败返回对应的错误码

注意:使用pthread_join是阻塞等待线程。

在Linux中,这些控制线程的函数都在libpthread.so动态库中,因此链接这些线程函数库时要使用编译器命令的“-lpthread”选项。

代码如下:

#include <iostream>
#include <pthread.h>
#include <string>
class Request
{
public:
    Request(const char *str, int _cnt = 0)
        : s(str), cnt(_cnt)
    {
    }
    std::string Transform(int num)
    {
        std::string str = s + "-";
        ++cnt;
        return str + std::to_string(num);
    }
public:
    std::string s;
    int cnt;
};
class Response
{
public:
    Response(int _cnt = 0)
        : cnt(_cnt)
    {
    }
public:
    int cnt;
};
void *Routine(void *arg)
{
    Response *prs = new Response;
    Request rq(static_cast<const char *>(arg));
    std::cout << "合并线程名称:" << rq.Transform(1);
    if (rq.cnt > 0)
        prs->cnt++;
    return (void *)prs;
}
int main()
{
    pthread_t tid; // 新线程的用户级ID
    void *retval;
    pthread_create(&tid, nullptr, Routine, (void *)"thread");
    pthread_join(tid, &retval); // 等待新线程并且获取线程启动函数的返回值
    Response *ret = static_cast<Response *>(retval);
    if (ret->cnt > 0) // 根据新线程启动函数返回值判断该线程的任务完成情况
    {
        std::cout << "thread-1执行任务成功!" << std::endl;
    }
    delete ret;
    return 0;
}


原文地址:https://blog.csdn.net/2401_84568462/article/details/140535602

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!