首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POSIX之Thread

POSIX之Thread

作者头像
Taishan3721
发布于 2022-12-05 07:54:13
发布于 2022-12-05 07:54:13
73200
代码可运行
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks
运行总次数:0
代码可运行

POSIX - Portable Operating System Interface of UNIX定义了操作系统为应用程序提供的接口标准。

今天看一看Posix针对Thread(线程)定义的几个基本API

pthread_create()与pthread_self()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 使用属性pAttr创建线程
 * 成功后将线程ID存入pThread
 * 线程入口为pEntry, 其入参为pArg
 */
int pthread_create
    (
    pthread_t *pThread,     /* Thread ID (out) */
    pthread_attr_t *pAttr,  /* Thread attributes object */
    void *(*pEntry)(void *),/* Entry function */
    void *pArg              /* Entry function argument */
    );
/*
 * 返回当前线程的ID
 * 如果调用者是VxWorks的Task, 则将其转换为POSIX线程
 */
pthread_t pthread_self();

写个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

static void *subThread(void *arg)
{
    printf(" new thread: tid %#x\n", (UINT32)pthread_self());
    return NULL;
    }

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t id;
    pthread_create(&id, NULL, subThread, NULL);

    sleep(1);
    printf("main thread: tid %#x\n", (UINT32)pthread_self());
    return OK;
    }

pthread_exit()与pthread_join()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 终止当前线程
 * 入参status为线程的返回值, 可供pthread_join()使用
 */
void pthread_exit
    (
    void *status
    );
/*
 * 阻塞当前线程,直到线程thread终止或取消
 * 线程thread必须是joinable状态
 *
 * 如果ppStatus不是NULL, 且pthread_join()成功返回,
 * 线程thread终止时的exit状态存于ppStatus
 */
int pthread_join
    (
    pthread_t thread,
    void **ppStatus
    );

写个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <pthread.h>

static void *subThread(void *arg)
{
    pthread_exit("byebye");
    return NULL;
    }

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t id;
    void *pStatus;

    pthread_create(&id, NULL, subThread, NULL);
    pthread_join(id, &pStatus);
    printf("subThread: %s\n", (char *)pStatus);
    return OK;
    }

如果线程不是正常exit,而是被取消或被VxWorks Task删除,则返回PTHREAD_CANCELED(-2)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#ifndef _WRS_KERNEL
#include <taskLib.h>
#endif
#include <pthread.h>

/*
#define PTHREAD_CANCELED    ((void *)-2)
*/

static void *subThread(void *arg)
{
    taskDelete(0);
    return NULL;
    }

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t id;
    void *pStatus;

    pthread_create(&id, NULL, subThread, NULL);
    pthread_join(id, &pStatus);
    printf("subThread: %d\n", (int)pStatus);
    return OK;
    }

如果pthread_join()操作的是当前线程,则返回EDEADLK(33)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <pthread.h>

/*
#define  EDEADLK    33
*/

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    int ret = pthread_join(pthread_self(), NULL);
    printf("pthread_join: %d\n", ret);
    return OK;
    }

如果pthread_join()操作的线程已不存在或者正在执行exit操作,则返回ESRCH(3)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <pthread.h>

/*
#define ESRCH     3
*/

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    int ret = pthread_join(0, NULL);
    printf("pthread_join: %d\n", ret);
    return OK;
    }

如果pthread_join()操作的线程已被执行过pthread_join(),则返回EINVAL(22)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#ifndef _WRS_KERNEL
#include <taskLib.h>
#endif
#include <pthread.h>

/*
#define EINVAL  22
*/

static void *subThread(void *arg)
{
    sleep(1);
    return NULL;
    }

static void threadWait(pthread_t id)
{
    int ret = pthread_join(id, NULL);
    printf("subThread: %d\n", ret);
    }

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t id;

    pthread_create(&id, NULL, subThread, NULL);
    taskSpawn(NULL, 100, 0, 0x2000, (FUNCPTR)threadWait, id, 0,0,0,0,0,0,0,0,0);
    taskSpawn(NULL, 100, 0, 0x2000, (FUNCPTR)threadWait, id, 0,0,0,0,0,0,0,0,0);
    sleep(2);
    return OK;
    }

pthread_detach()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 将线程thread置于detached状态.
 * 则,其它线程不能通过pthread_join()进行同步.
 */
int pthread_detach
    (
    pthread_t thread
    );

再执行pthread_join()操作则返回EINVAL(22)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <pthread.h>

/*
#define EINVAL  22
*/

static void *subThread(void *arg)
{
    sleep(1);
    return NULL;
    }

#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t id;
    int ret;

    pthread_create(&id, NULL, subThread, NULL);
    pthread_detach(id);
    ret = pthread_join(id, NULL);
    printf("subThread: %d\n", ret);
    sleep(2);
    return OK;
    }

pthread_equal()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 测试两个线程是否相同
 * 相同则返回1, 否则返回0
 */
int pthread_equal
    (
    pthread_t t1,
    pthread_t t2
    );

pthread_once()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 此机制确保initFunc只执行一次
 */
int pthread_once
    (
    pthread_once_t *pOnceControl,
    void (*initFunc)(void)
    );

写个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 版权所有  公众号  VxWorks567
 */
#include <stdio.h>
#include <pthread.h>

static int data=0;
 
static pthread_once_t once = PTHREAD_ONCE_INIT;
 
void threadInit()
{
    data = -1;
    printf("Thread %#x initializes data: %d\n", (UINT32)pthread_self(), data);
    }
 
void *subThread(void *arg)
{
    pthread_once(&once, &threadInit);

    data++;
    printf("Thread %#x uses data: %d\n", (UINT32)pthread_self(), data);

    pthread_exit(&data);
    return NULL;
    }
 
#ifdef _WRS_KERNEL
int testThread()
#else
int main()
#endif
{
    pthread_t tid1;
    pthread_t tid2;
    int *pData;

    pthread_create(&tid1, NULL, &subThread, NULL);
    pthread_join(tid1, (void **)&pData);
    printf("thread %#x returns data: %d\n", (UINT32)tid1, *pData);

    pthread_create(&tid2, NULL, &subThread, NULL);
    pthread_join(tid2, (void **)&pData);
    printf("thread %#x returns data: %d\n", (UINT32)tid2, *pData);
    return OK;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
POSIX之Thread-Specific Data
进程里的多个线程,共享该进程的全局变量。Posix定义了一种Thread-Specific Data,它看起来是个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。
Taishan3721
2022/12/05
2840
POSIX之Thread Barrier
主线程依次启动三个线程,必须四个线程都执行到pthread_barrier_wait()后,后续的pthread_barrier_destroy()才会执行
Taishan3721
2022/06/30
5980
POSIX之Thread Barrier
Posix多线程编程
线程存在于进程当中,是操作系统调度执行的最小单位。说通俗点线程就是干活,多线程也就是同时可以干不同的活而且还不会互相打扰,线程并没有自己的独立空间。
杨源鑫
2019/07/04
9040
Posix多线程编程
线程在线猛干,老李落泪回忆 --- 多线程系列(二)
大家好,我是文章格式越来越不修边幅、写法越来越随意的谢顶道人 --- 老李。最近有些人问老李,你是如何面对自己越来越大的年纪与自己越来越少的头发之间这种矛盾的,关于这件事儿,作为过来人的我自然是有一番心得的,不然怎么可能自称为道人?
老李秀
2021/06/17
5130
线程在线猛干,老李落泪回忆 --- 多线程系列(二)
POSIX之Condition Variable
Condition Variable(简称Condition)是Posix定义的一种同步机制 - Thread为了某些数据的特定状态,而阻塞执行,等待其它Thread的通知。使用时有个限制 - Condition Variable必须与Mutex关联使用。怎么感觉有点像关联到信号量的Event?
Taishan3721
2022/12/05
6330
POSIX之Condition Variable
linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
本文介绍了多线程和线程同步的基础知识,并基于Linux环境进行了详细的实例分析。通过本文的学习,读者可以掌握多线程和线程同步的基本原理,并能够使用相关技术解决实际问题。
s1mba
2017/12/28
3.5K0
linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
Linux多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux 下pthread的实现是通过系统调用clone()来实现的。clone()是 Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的 多线程程序 pthread_create.c。 一个重要的线程创建函数原型:
用户6754675
2019/11/27
2.3K0
pthread_create 线程属性-Linux学习——线程的创建和回收
  int ( thread, const attr, void ()(void ), void arg);
宜轩
2022/12/26
1.3K0
POSIX之Reader-Writer Lock
VxWorks从69开始,提供了完善的读写信号量。而在Vx7的RTP里实现了Posix定义的Reader-Writer Lock(读写锁),这是Thread库的一种互斥机制,比Mutex有着更高的适用性。可以有多个Thread以Reader的模式同时lock读写锁,或者只有一个Thread以Writer的模式lock读写锁。这种锁适用对数据进行读的次数比写的次数多的情况,因为读锁可以进行共享
Taishan3721
2022/12/05
4420
POSIX之Reader-Writer Lock
【Linux篇章】线程操控术2:如何让代码如千军万马听你号令(精讲线程控制)
与线程有关的函数构成了⼀个完整的系列,绝⼤多数函数的名字都是以“pthread_”打头的;要使⽤这些函数库,要通过引⼊头⽂ <pthread.h>;链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项。
羑悻的小杀马特.
2025/06/13
1340
【Linux篇章】线程操控术2:如何让代码如千军万马听你号令(精讲线程控制)
多线程编程C语言版
什么是多线程,提出这个问题的时候,我还是很老实的拿出操作系统的书,按着上面的话敲下“为了减少进程切换和创建开销,提高执行效率和节省资源,我们引入了线程的概念,与进程相比较,线程是CPU调度的一个基本单位。”
DeROy
2021/11/16
3.9K0
多线程编程C语言版
Linux系统编程-几个多线程DEMO
本章将分为两大部分进行讲解,前半部分将引出线程的使用场景及基本概念,通过示例代码来说明一个线程创建到退出到回收的基本流程。后半部分则会通过示例代码来说明如果控制好线程,从临界资源访问与线程的执行顺序控制上引出互斥锁、信号量的概念与使用方法。
韦东山
2020/09/30
2K0
Linux系统编程-几个多线程DEMO
【Linux篇】程控制全揭秘:如何通过 POSIX 库管理线程的生命周期
站在不同的用户角度线程的说法也不同,在用户角度,就称为线程;在操作系统角度称为轻量级进程(也叫做lwp)。
熬夜学编程的小王
2025/05/02
2060
【Linux篇】程控制全揭秘:如何通过 POSIX 库管理线程的生命周期
RTP之Signal的使用(一)
区别一:Kernel Task默认Unblock所有Signal;Kernel创建的RTP默认Unblock所有Signal;被RTP创建的RTP,继承原有RTP的Mask
Taishan3721
2022/12/05
4990
RTP之Signal的使用(一)
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝里慢慢看 (1)
官方话就是:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
看、未来
2020/08/25
4260
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝里慢慢看  (1)
多线程编程初探:掌握基本概念与核心原理
就是我们在进程当中运行程序的时候都是单执行流往下运行的,如果要多执行流往下运行,就需要引入多进程。
绝活蛋炒饭
2024/12/29
5280
多线程编程初探:掌握基本概念与核心原理
POSIX之Mutex
多任务共享资源需要互斥,VxWorks里可以使用互斥信号量。Posix也定义类似的概念:用于Thread的Mutex
Taishan3721
2022/12/05
1.1K0
POSIX之Mutex
Linux多线程Pthread学习小结
POSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程.
阳光岛主
2019/02/20
2.2K0
掌握死锁检测:策略和最佳实践
死锁,是指多个线程或者进程在运行过程中因争夺资源而造成的一种僵局,当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。 如下图所示,线程 A 想获取线程 B 的锁,线程 B 想获取线程 C 的锁,线程 C 想获取线程 D 的锁,线程 D 想获取线程 A 的锁,从而构建了一个资源获取环。
Lion 莱恩呀
2024/10/12
2570
掌握死锁检测:策略和最佳实践
POSIX之Thread attribute
创建Thread时,需要通过参数指定attribute,如果参数为NULL则使用默认值。或者使用pthread_attr_init()初始化一个attribute对象
Taishan3721
2022/12/05
5770
POSIX之Thread attribute
相关推荐
POSIX之Thread-Specific Data
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档