首页 运维 linux运维 linux有创建线程的函数吗

linux有创建线程的函数吗

Mar 25, 2022 pm 04:00 PM
linux 创建线程

linux有创建线程的函数,即“pthread_create()”函数。该函数是类Unix操作系统中创建线程的函数,支持四个参数:参数1是指向线程标识符的指针、参数2用来设置线程属性、参数3是线程运行函数的起始地址、参数4是运行函数的参数。

linux有创建线程的函数吗

本教程操作环境:linux5.9.8系统、Dell G3电脑。

linux有创建线程的函数,那就是pthread_create()函数。

pthread_create()是类Unix操作系统(Unix、Linux、Mac OS X等)中创建线程的函数

头文件

  #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传入。
    );
登录后复制

返回值

  • 若成功则返回0,否则返回出错编号

参数

  • 第一个参数为指向线程标识符的指针。

  • 第二个参数用来设置线程属性。

  • 第三个参数是线程运行函数的地址。

  • 最后一个参数是运行函数的参数。

注意

  在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。

函数用法

#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\n");  // 线程1执行体
        sleep(10);
        printf("TaskEntry entry num = 0 is over!!!\n");
    } else if (num == 1) {
        printf("TaskEntry entry num = 1\n");  // 线程2执行体
        sleep(10);
        printf("TaskEntry entry num = 1 is over!!!\n");
    } else if (num == 2) {
        printf("TaskEntry entry num = 2\n");  // 线程3执行体
        sleep(2);
        printf("TaskEntry entry num = 2 is over!!!\n");
    }
}

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\n", index);  // 主线程执行打印操作
    }
}

int main(void)
{
    // 创建3个线程
    vector<pthread_t> taskID(3);
    vector<Sample> taskArgs(3);
    for (int i = 0; i < 3; i++) {
        taskArgs[i] = { i, &#39;a&#39;, 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!!!\n");
    return 0;
}
登录后复制

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

相关推荐:《Linux视频教程

以上是linux有创建线程的函数吗的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
Linux体系结构:揭示5个基本组件 Linux体系结构:揭示5个基本组件 Apr 20, 2025 am 12:04 AM

Linux系统的五个基本组件是:1.内核,2.系统库,3.系统实用程序,4.图形用户界面,5.应用程序。内核管理硬件资源,系统库提供预编译函数,系统实用程序用于系统管理,GUI提供可视化交互,应用程序利用这些组件实现功能。

git怎么查看仓库地址 git怎么查看仓库地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 仓库地址,请执行以下步骤:1. 打开命令行并导航到仓库目录;2. 运行 "git remote -v" 命令;3. 查看输出中的仓库名称及其相应的地址。

vscode上一步下一步快捷键 vscode上一步下一步快捷键 Apr 15, 2025 pm 10:51 PM

VS Code 一步/下一步快捷键的使用方法:一步(向后):Windows/Linux:Ctrl ←;macOS:Cmd ←下一步(向前):Windows/Linux:Ctrl →;macOS:Cmd →

notepad怎么运行java代码 notepad怎么运行java代码 Apr 16, 2025 pm 07:39 PM

虽然 Notepad 无法直接运行 Java 代码,但可以通过借助其他工具实现:使用命令行编译器 (javac) 编译代码,生成字节码文件 (filename.class)。使用 Java 解释器 (java) 解释字节码,执行代码并输出结果。

sublime写好代码后如何运行 sublime写好代码后如何运行 Apr 16, 2025 am 08:51 AM

在 Sublime 中运行代码的方法有六种:通过热键、菜单、构建系统、命令行、设置默认构建系统和自定义构建命令,并可通过右键单击项目/文件运行单个文件/项目,构建系统可用性取决于 Sublime Text 的安装情况。

Linux的主要目的是什么? Linux的主要目的是什么? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服务器操作系统,2.嵌入式系统,3.桌面操作系统,4.开发和测试环境。Linux在这些领域表现出色,提供了稳定性、安全性和高效的开发工具。

laravel安装代码 laravel安装代码 Apr 18, 2025 pm 12:30 PM

要安装 Laravel,需依序进行以下步骤:安装 Composer(适用于 macOS/Linux 和 Windows)安装 Laravel 安装器创建新项目启动服务访问应用程序(网址:http://127.0.0.1:8000)设置数据库连接(如果需要)

git软件安装 git软件安装 Apr 17, 2025 am 11:57 AM

安装 Git 软件包括以下步骤:下载安装包运行安装包验证安装配置 Git安装 Git Bash(仅限 Windows)

See all articles