Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Adakah Linux mempunyai fungsi untuk mencipta benang?

Adakah Linux mempunyai fungsi untuk mencipta benang?

青灯夜游
青灯夜游asal
2022-03-25 16:00:132636semak imbas

Linux mempunyai fungsi untuk mencipta benang iaitu fungsi "pthread_create()". Fungsi ini ialah fungsi yang mencipta benang dalam sistem pengendalian seperti Unix Ia menyokong empat parameter: parameter 1 ialah penunjuk kepada pengecam benang, parameter 2 digunakan untuk menetapkan atribut benang, parameter 3 ialah alamat permulaan fungsi berjalan benang. , dan parameter 4 ialah Parameter untuk menjalankan fungsi.

Adakah Linux mempunyai fungsi untuk mencipta benang?

Persekitaran pengendalian tutorial ini: sistem linux5.9.8, komputer Dell G3.

Linux mempunyai fungsi untuk mencipta benang, iaitu fungsi pthread_create().

pthread_create() ialah fungsi yang mencipta urutan dalam sistem pengendalian seperti Unix (Unix, Linux, Mac OS X, dll.)

Fail pengepala

#includecc7ade6c52b5948d3b8647c25104afae

Pengisytiharan fungsi

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传入。
    );

Nilai pulangan

  • Jika berjaya, kembalikan 0, jika tidak kembalikan nombor ralat

Parameter

  • Parameter pertama ialah penunjuk kepada pengecam benang.

  • Parameter kedua digunakan untuk menetapkan atribut benang.

  • Parameter ketiga ialah alamat fungsi thread berjalan.

  • Parameter terakhir ialah parameter untuk menjalankan fungsi.

Nota

Semasa menyusun, sila tambah parameter -lpthread untuk memanggil perpustakaan pautan statik. Kerana pthread bukan perpustakaan lalai untuk sistem Linux.

Penggunaan Fungsi

#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;
}

Perhatikan bahawa apabila menggunakan kompilasi, anda perlu menambah pilihan kompilasi -lpthread, contohnya: g -lpthread main.cpp -o utama

Cadangan berkaitan: "Tutorial Video Linux"

Atas ialah kandungan terperinci Adakah Linux mempunyai fungsi untuk mencipta benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn