• linux线程创建函数


    linux线程创建函数

    pthread_create函数是(linux/unix/macos)等操作系统的创建线程的函数,它的功能是创建线程。

    函数原型如下:

    #include<pthread.h>
    int pthread_create(
        pthread_t *restrict tidp,   //新创建的线程ID指向的内存单元。
        const pthread_attr_t *restrict attr,  //线程属性,默认为NULL
        void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行
        void *restrict arg //默认为NULL。上述函数需要参数,将参数放入结构中并将地址作为arg传入。
        );
    

    函数用法

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <pthread.h>
    #include <unistd.h>
    #include <vector>
    #include "main.h"
    
    using namespace std;
    
    struct Sample {
        uint32_t index;
        char sex;
        uint32_t age;
        uint32_t result;
    };
    
    void* TaskEntry(void *args)
    {
        Sample *sa = (Sample*)args;
        uint32_t num = sa->index;
        if (num == 0) {
            printf("TaskEntry entry num = 0
    ");  // 线程1执行体
            sleep(10);
            printf("TaskEntry entry num = 0 is over!!!
    ");
        } else if (num == 1) {
            printf("TaskEntry entry num = 1
    ");  // 线程2执行体
            sleep(10);
            printf("TaskEntry entry num = 1 is over!!!
    ");
        } else if (num == 2) {
            printf("TaskEntry entry num = 2
    ");  // 线程3执行体
            sleep(2);
            printf("TaskEntry entry num = 2 is over!!!
    ");
        }
    }
    
    uint32_t CreateTask(pthread_t& pid, Sample& sample)
    {
        // 假设Sample.index == 2创建任务失败,直接返回
        if (sample.index == 2) {
            return 2;
        }
        pthread_attr_t  attr;  // 设置线程属性
        pthread_attr_init(&attr);
        pthread_attr_setstacksize(&attr, 64 * 1024);  // 设置线程栈大小为64KB
        uint32_t ret = pthread_create(&pid, &attr, (void*(*)(void*))TaskEntry, (void*)&sample);
        if (ret != 0) {
            return ret;
        }
        pthread_attr_destroy(&attr); // 取消线程的设置属性
        return 0;
    }
    
    void VerifyTask(vector<pthread_t>& taskID, vector<Sample>& taskArgs)
    {
        void *ret;
        for (int index = 0; index<2; index++) {
            // 等待线程结束,释放相应的资源。pthread_join会堵塞主线程不会堵塞其他子线程,然后等待监控的线程执行完成,再返回主线程
            // 在此处线程执行顺序为:线程1--主线程--线程2--主线程--线程3
            pthread_join(taskID[index], &ret);  // 堵塞主线程,执行子线程taskID[index],等待子线程taskID[index]执行完成释放资源
            printf("task[%d] is over
    ", index);  // 主线程执行打印操作
        }
    }
    
    int main(void)
    {
        // 创建3个线程
        vector<pthread_t> taskID(3);
        vector<Sample> taskArgs(3);
        for (int i = 0; i < 3; i++) {
            taskArgs[i] = { i, 'a', 90, 0};
            uint32_t ret = CreateTask(taskID[i], taskArgs[i]);
            if (ret != 0) {
                // 模拟如下场景:任务创建失败,直接停止前面的任务
                for (int j = 0; j<i; j++) {
                    pthread_cancel(taskID[j]); // 子线程1和子线程2延迟10s,当线程3创建失败时,直接让其停止。
                }
                //return ret;  // 主线程退出,所有子线程一起退出
            }
        }
        VerifyTask(taskID, taskArgs); // 校验线程是否结束
        printf("three thead is running over!!!
    ");
        return 0;
    }
    

    注意编译的使用需要加上编译选项-lpthread,比如:g++ -lpthread main.cpp -o main

  • 相关阅读:
    编程语言的进化
    面向对象
    面向对象oop
    .NET——内存分配
    使用IIS承载WCF服务
    .NET代码生成器ASP.NET Factory 开放所有源代码下载
    SyntaxHighlighter
    写代码的三重境界
    Wijmo jQuery 插件集
    给vs2012换肤
  • 原文地址:https://www.cnblogs.com/wangdongfang/p/14489116.html
Copyright © 2020-2023  润新知