posix线程库重要的程度不言而喻,这些天学习这个,参考 https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/
 
首先先看第一个基本的程序

#include <stdio.h>

#include <pthread.h>

#include <stdlib.h>

#include <unistd.h>

void * thread_function(void * arg)

{

int i ;

for (i=0; i<20; i++) {

printf("thread says hi!\n");

sleep(1);

}

return NULL;

}

int main(int argc, const char * argv[])

{

pthread_t mythread;

if (pthread_create(&mythread, NULL, thread_function, NULL)) {

printf("error creating thread.");

abort();

}

if (pthread_join(mythread, NULL)) {

printf("error joining thread");

abort();

}

return 0;

}

对于要使用posix线程库要引用头文件<pthread.h>,里面所有的函数都是以pthread_t开头。

看main函数,定义一个pthread_t保存线程的ID,具体的结构可以进去看看,大概就是一个结构体如下

struct _opaque_pthread_t { long __sig; struct __darwin_pthread_handler_rec  *__cleanup_stack; char __opaque[__PTHREAD_SIZE__]; };

 
下面就是创建一个线程pthread_create,看一看其定义

int       pthread_create(pthread_t * __restrict,

const pthread_attr_t * __restrict,

void *(*)(void *),

void * __restrict);

 
第一个参数存放线程的ID,
第二个参数可用来定义线程的某些属性。由于缺省的线程属性是适用的,只需将该参数设为 NULL。
第三个参数是线程开始执行时调用的函数的名字。函数的格式必须如下:
void * f(void * arg)
对于上述程序中函数名为thread_function。当thread_function()返回时,线程将终止。返回的void指针将被pthread_join函数当成退出状态来处理。
第四个参数是传递函数f的参数。
对于pthread_create创建成功返回0,不成功返回一个非零的错误码,因此上面放在if上面判断。
 
好,当pthread_create创建成功之后,程序有了两个线程,主程序同样是一个线程,主程序仍然执行,另外一个线程执行完成之后,先停止后与另外的线程合并。
 
下面执行pthread_join,pthread_create是将一个线程分成两个线程,pthread_join是将两个线程合并成一个线程。这个函数将调用这个函数的线程等待指定的线程运行完成再继续执行。

int       pthread_join(pthread_t , void **)

第一个参数为要等待的线程Id

第二个参数给指向返回值的指针提供一个位置,如果为NULL,则我们就不用关心其返回值是啥了

pthread_join就是等待另外的线程执行完成,进行线程合并。这个是有必要的,要注意对线程合理的释放,不然最后可能会导致创建失败。

posix线程库1的更多相关文章

  1. Linux posix线程库总结

    由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...

  2. Posix线程编程指南(2) 线程私有数据

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  3. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  4. 浅谈POSIX线程的私有数据

    当线程中的一个函数需要创建私有数据时,该私有数据在对函数的调用之间保持一致,数据能静态地分配在存储器中,当我们采用命名范围也许可以实现它使用在函数或是文件(静态),或是全局(EXTERN).但是当涉及 ...

  5. POSIX 线程详解(经典必看)

    http://www.cnblogs.com/sunminmin/p/4479952.html 总共三部分: 第一部分:POSIX 线程详解                               ...

  6. 转载:Posix线程编程指南(2)

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  7. Posix线程编程指南

    Posix线程编程指南 Posix线程编程指南... 1 一线程创建与取消... 2 线程创建... 2 1.线程与进程... 2 2. 创建线程... 2 3. 线程创建属性... 2 4. 创建的 ...

  8. Posix线程编程指南(2)

    这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第2篇将向您讲述线程的创建与取消. 一.概念及作用在单线程程序中,我们经常要用到"全 ...

  9. Posix线程编程指南(3)

    这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第三篇将向您讲述线程同步. 一.互斥锁尽管在Posix Thread中同样可以使用IPC的信号 ...

随机推荐

  1. bzoj题目分类

    转载于http://blog.csdn.net/creationaugust/article/details/513876231000:A+B 1001:平面图最小割,转对偶图最短路 1002:矩阵树 ...

  2. 聊聊 webpack 打包如何压缩包文件大小

    想必很多人都经历过做完一个项目后,再打包发现某些文件非常大,导致页面加载时很慢,这就很影响用户体验了,所以在我经历了一些打包后,讲讲如何有效地缩小包体积,加快页面的首屏渲染 动态 polyfill 相 ...

  3. 深入理解JWT的使用场景和优劣

    前面简单介绍了JWT的基础只是和简单的小Demo,但是对于JWT的应用场景和优缺点掌握的还够,这些东西只有自己实践过才能搞清楚其中的细节.在网上看到一个大佬对这块讲的比较好,就转载过来一起学习下. 原 ...

  4. JavaScript 计时器

    在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.计时器类型:一次性计时器:仅在指定的延迟时间之后触发一次.间隔性触发计时器:每隔一定的时间间隔就触发一次 ...

  5. Android内存管理(12)*「实例」用Monitor 生成.hprof文件 并分析内存泄漏

    参考 http://blog.csdn.net/xiaanming/article/details/42396507 基本步骤: 1,准备一个有内存泄漏的代码 2,如何发现内存泄漏 3,生成.hpro ...

  6. 在 kafka 的 broke 和 client 之间加入 SSL 双向认证

    在 kafka 的 broke 和 client 之间加入 SSL 双向认证https://blog.csdn.net/hohoo1990/article/details/79110031 kafka ...

  7. HeadFirst HTML&CSS

    CH1 认识HTML HTML和CSS是我们用来创建网页的语言:HTML是超文本标记语言(HyperText Markup Language)的缩写,用来建立网页的结构:CSS是层叠样式表(Casca ...

  8. DB2使用收集

    db2命令收集 创建带分区的表: create table  table_name( )in table_space index in index_space partition by range(c ...

  9. Angular——表单指令

    基本介绍 这些指定只能针对input标签 基本使用 <!DOCTYPE html> <html lang="en"> <head> <me ...

  10. jQuery——表格添加数据

    1.遮罩层宽高100%,position,不占位 2.注册a标签的删除事件,用on()方法,以方法可以动态添加,之前js需要利用冒泡属性(父标签注册事件,子标签冒泡,target===li触发事件) ...