`
hyshucom
  • 浏览: 809799 次
文章分类
社区版块
存档分类
最新评论

Linux多线程函数解析

 
阅读更多
Linux多线程函数解析
Linux多线程函数用得比较多的是下面的3个
pthread_create(),pthread_exit(),pthread_join();它们都是在头文件<pthread.h>之中。编译时需要加静态库-lpthread

下面是函数的说明:
  pthread_create是UNIX环境创建线程函数
int pthread_create(
pthread_t *restrict tidp,
const pthread_attr_t *restrict_attr,
void*(*start_rtn)(void*),
void *restrict arg);
返回值
  若成功则返回0,否则返回出错编号
  返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
  linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
  由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。
参数
  第一个参数为指向线程标识符的指针。
  第二个参数用来设置线程属性。
  第三个参数是线程运行函数的起始地址。
  最后一个参数是运行函数的参数。
另外,在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库


pthread_exit(void* retval);
线程通过调用pthread_exit函数终止自身执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。该指针可以通过pthread_join(pthread_t tpid, void **value_ptr)中的第二个参数value_ptr获取到。

函数pthread_join用来等待一个线程的结束。函数原型为:
  extern int pthread_join __P (pthread_t __th, void **__thread_return);
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程退出时的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。


下面是一个简单的例子,子线程thread_fun会打出5次“this is thread_fun print!”然后调用pthread_exit退出,并返回一个指向字符串“this is thread return value!”的指针。在主函数里面调用pthread_join等待thread_fun线程结束,然后读取子线程的返回值到value中,再打印出来。
输出结果是:
pthread_create ok!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
this is thread_fun print!
pthread exit value: this is thread return value!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include <pthread.h>
//////////////////////////////////////////////////////
void *thread_fun(void *arg) {
    int i=0;
    char *value_ptr = "this is thread return value!\n";
    for (i=0; i<5; i++) {
        printf("this is thread_fun print!\n");
        sleep(1);
    }
    pthread_exit((void*)value_ptr);
}
//////////////////////////////////////////////////////
int main(int argc, char **argv) {
    pthread_t pid;
    int ret;
    void* value;

    ret = pthread_create(&pid, NULL, thread_fun, NULL);
    if (ret) {
        printf("pthread_create failed!\nerrno:%d\n", errno);
        return -1;
    }
    printf("pthread_create ok!\n");

    pthread_join(pid, &value);
    printf("pthread exit value: %s\n", value);
    return 0;
}

 

分享到:
评论

相关推荐

    linux多线程编程

    详细介绍了linux多线程编程用到的函数,解析,以及源代码,对pthread编程入门有很大帮助

    Linux c httpPOST与GET接口实现方法

    LINUX C 下HTTP处理函数的POST以及GET的处理接口实现方法

    LInux 平台下物联网网关(多线程实现),嵌入式项目

    应用于物联网嵌入式项目 包括参数数据解析、协议转换、Socket...为了实现多线程,使用了Linux提供的pthread库,它提供了创建和管理线程的函数和数据结构。互斥锁和条件变量用于确保线程之间的同步和互斥访问共享资源。

    Linux下DNS反向解析程序C原代码

    Linux下进行DNS反向解析的一段C代码,目前支持两种格式的输入,单进程单线程,正在改进为多线程以提高效率。

    Linux C程序设计大全

    3.6.2 链接时符号解析规则 3.6.3 链接规则的应用 3.7 可变参数 3.7.1 可变参数的概念 3.7.2 实现一个简单的可变参数的函数 3.7.3 可变参数实例 3.7.4 关于printf函数的疑问——缺少整型参数 3.7.5 关于printf函数的...

    Linux高性能服务器编程

    包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;...

    Python实现多线程HTTP下载器示例

    在介绍多线程之前首先介绍单线程。编写单线程的思路为: 1.解析url; 2.连接web服务器; 3.构造http请求包; 4.下载文件。 接下来通过代码进行说明。 解析url 通过用户输入url进行解析。如果解析的路径为空,则...

    linux网络编程-宋敬彬-part1

    4.4.1 多线程编程实例 127 4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     15.3.3 多进程的并发服务器和多线程的并发服务器  15.3.4 客户端进程的多线程化  本章小结 第十六章 网络售票系统的简单模拟  16.1 系统的总体设计  16.1.1 应用的说明  16.1.2 数据格式的...

    php的POSIX 函数以及进程测试的深入分析

    复制代码 代码如下:&lt;?... //8805sleep(10);... 您可能感兴趣的文章:深入解析PHP中的(伪)多线程与多进程PHP多进程编程实例深入探究PHP的多进程编程方法PHP下操作Linux消息队列完成进程间通信的方法PH

    IPv6教学软件的设计和实现

    本文详细讨论了一套IPv6的教学软件的设计和开发实现过程,其中重点研究了软件...还研究了软件的界面设计,通过gtk界面设计语言开发界面,并运用多线程多进程编程与网络数据分析接口函数相结合,达到软件教学的效果。

    Qt调用百度人脸识别的例程

    基于Qt5调用百度ai的人脸识别接口。...打开该qt工程后,在mainwindow.cpp的构造函数中,输入自己的api key和secret key即可使用。 如果使用qt5.15以上版本,如果本地没有libssl和libcryto库,请自行下载安装。

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    linux网路编程 中文 23M 版

    2.3.8 Makefile 中的函数.............................................. 46 2 . 4 用G D B 调试程序..................................................... 47 2 . 4 . 1编译可调试程序............................

    C/C++笔试题(附答案,华为面试题系列)

    Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc...

    uftrace:CC ++ Rust的功能图跟踪器

    uftrace uftrace工具用于跟踪和分析以C / C ++编写的程序的执行。 它在很大程度上受到Linux内核的ftrace框架... 它支持多进程和/或多线程应用程序。 如果系统启用了内核中的函数图跟踪器( CONFIG_FUNCTION_GRAPH_T

    《C语言深度解析》第9、10章——位操作 /c标准IO、网络编程/线程/链表

    本课程主要讲解以下内容:1. 位操作(位运算)2. c语言的标准IO函数3.标准IO与文件IO、常见标准IO函数有哪些、fopen/...多线程、网络编程、数据库、数据结构、顺序表、链表、单链表、双链表、队列/栈、Linux内核链表

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步...

Global site tag (gtag.js) - Google Analytics