当前位置: 首页 > article >正文

pthread_create函数

函数原型

pthread_create 是 POSIX 线程(pthread)库中的一个函数,用于在程序中创建一个新线程。

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                void *(*start_routine) (void *), void *arg);

参数解释

  1. pthread_t *thread: 这是一个指向 pthread_t 类型的指针,用于存储新创建线程的线程标识符。调用者必须分配这个指针,pthread_create 会将其设置为新线程的标识符。
  2. const pthread_attr_t *attr: 这是一个指向 pthread_attr_t 结构的指针,用于指定线程的属性。如果设置为 NULL,则使用默认属性。常见的属性包括线程的调度策略、优先级、堆栈大小等。
  3. void *(*start_routine) (void *): 这是一个指向线程函数的指针。这个函数是新线程启动后要执行的函数。它的返回类型是 void*,并接受一个 void* 类型的参数。
  4. void *arg: 这是传递给线程函数的参数。该参数的类型是 void*,因此可以传递任何类型的数据,只需在线程函数中进行适当的类型转换。

返回值

  • 成功时,pthread_create 返回 0
  • 失败时,返回一个非零的错误码。

代码示例 

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <thread>   //包含C++标准线程头文件
#include <sstream>  //包含字符串流头文件

void inputCurPthreadId()
{
    //通过C++标准库获取当前线程号
    std::thread::id threadID = std::this_thread::get_id();
    //将 std::thread::id 转换为一种 QDebug 能够处理的类型
    std::ostringstream oss;
    oss << threadID;
    std::string threadIDStr = oss.str();
    qDebug() << "[C++] This Thread Id = " << QString::fromStdString(threadIDStr);

    //Qt QThread类获取当前线程
    qDebug() << "[Qt] This Thread = " << QThread::currentThread() << "\n";
}

// 线程函数
void* threadFunction(void* arg) 
{
    qDebug() << "In pthread_create:";
    inputCurPthreadId();
    int threadNumber = *((int*)arg);
    std::cout << "Hello from thread " << threadNumber << "!\n";
    sleep(2); // 模拟一些工作
    std::cout << "Thread " << threadNumber << " is exiting.\n";
    pthread_exit(NULL); // 退出线程
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "before pthread_create:";
    inputCurPthreadId();

    pthread_t thread;
    int threadNumber = 1;

    // 创建线程
    if (pthread_create(&thread, NULL, threadFunction, (void*)&threadNumber) != 0) {
        std::cerr << "Error creating thread\n";
        return 1;
    }

    // 等待线程完成
    if (pthread_join(thread, NULL) != 0) {
        std::cerr << "Error joining thread\n";
        return 2;
    }

    qDebug() << "after pthread_create:";
    inputCurPthreadId();

    std::cout << "Main thread is exiting.\n";
    
    return a.exec();
}

注意事项

  1. 线程同步:多个线程可能会访问共享资源,因此需要使用同步机制(如互斥锁、条件变量等)来避免竞争条件。
  2. 线程属性:如果需要设置特定的线程属性(如堆栈大小、调度策略等),可以使用 pthread_attr_set* 函数族来配置 pthread_attr_t 结构。
  3. 线程退出:线程可以通过调用 pthread_exit 函数来退出,或者在线程函数中返回。主线程在所有其他线程完成之前不应该退出,否则会导致程序异常终止。
  4. 线程清理:使用 pthread_join 函数等待线程完成并回收其资源。如果不需要等待线程完成,可以使用 pthread_detach 函数将线程分离。

http://www.kler.cn/a/511656.html

相关文章:

  • 大数据学习(36)- Hive和YARN
  • 【博客之星2024年度总评选】年度回望:我的博客之路与星光熠熠
  • lvm快照备份
  • python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)
  • 如何使用C#与SQL Server数据库进行交互
  • 讲一下ZooKeeper的持久化机制?
  • DeviceNet转Profinet网关+FANUC机器人:打造工业界的灭霸手套,掌控无限可能
  • owasp SQL 注入测试-01 (准备工作)
  • Jmeter 动态参数压力测试时间段预定接口
  • 前缀和算法习题篇(下)
  • 网络安全---CMS指纹信息实战
  • [练习]简单结构体操作程序
  • 告别 Excel,拥抱 R 语言:开启数据分析新时代
  • k8s集成MinIo
  • 精品PPT | 某制造集团灯塔工厂解决方案
  • C# 操作 文件
  • [STM32 HAL库]串口中断编程思路
  • 微服务入门:从零开始构建你的微服务架构
  • xiao esp32 S3播放SD卡wav音频
  • 最大矩阵面积问题
  • 【GPT进化之路】从 GPT-1 的初试锋芒到 GPT-4 的跨模态智能时代
  • 青少年CTF练习平台 EasyMD5解题思路
  • go语言zero框架通过chromedp实现网页在线截图的设计与功能实现
  • SQLMAP的下载安装和使用(Windows)
  • HTML 的基础知识及其重要性
  • go语言 goc覆盖率统计