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.
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
#include<pthread.h>
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, '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!!!\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!