一 什么是线程

  线程:是一个进程内部的一个控制序列。

二 使用POSIX的注意点

  1 为了使用线程函数库,必须定义宏_REENTRANT,通过定义_REENTRANT来告诉编译器我们需要可重入功能,可重入代码可以被多次调用而仍然正常工作。

  2 在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。

三创建线程程序前的准备

  1 创建线程

#include <pthread.h>
int pthread_create(pthread_t *thread,           //指向变量中将被写入一个标识符的指针
           pthread_attr_t *attr,         //用于设置线程的属性
           void *(*start_routine)(void*),   //告诉线程将要启动执行的函数
           void *arg               //告诉线程传递给该函数的参数
           );

  2 终止线程

#include <pthread.h>
void pthread_exit(void *retval);

  作用:终止调用它的线程并返回一个指向某个对象的指针。

  3 等待线程结束

#include <pthread.h>
int pthread_join(pthread_t th,        //指定了将要等待的线程,线程通过pthread_create返回的标识符来指定
          void **thread_return    //是一个指针,它指向另一个指针,而后者指向线程的返回值
          );

四 第一个线程程序

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

//声明线程函数
void *thread_function(void *arg);
//线程函数参数
char message[]="Hello World"; int main(){
   //接收线程函数的返回值
int res;
   //线程标识符
pthread_t a_thread;
   //指向线程的返回值
void *thread_result;
//创建线程
res=pthread_create(&a_thread,NULL,thread_function,(void *)message);
//如果线程没有创建成功,注意pthread_系列函数失败后不是返回-1
if(res!=){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish...\n");
   //等待线程结束
res=pthread_join(a_thread,&thread_result);
   //如果等待线程失败
if(res!=){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined,it returned %s\n",(char *)thread_result);
printf("Message is now %s\n",message);
exit(EXIT_SUCCESS);
} void *thread_function(void *arg){
printf("*thread_function is running.Argument was %s\n",(char *)arg);
   //睡眠3秒
sleep();
   //将“Bye!”赋值给参数message
strcpy(message,"Bye!");
   //退出线程
pthread_exit("Thank you for the CPU time");
}

  运行结果:

Linux学习笔记20——第一个多线程程序的更多相关文章

  1. 嵌入式Linux学习笔记之第一阶段---基础篇

    嵌入式Linux学习分五个阶段 第一阶段: 01嵌入式环境搭建初期 02C语言语法概述 03C语言内存操作 04c语言函数 05linux基础 06gun基础 第二阶段: 01-linux之io系统编 ...

  2. Linux学习笔记(20) Linux系统管理

    1.进程管理 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用有判断服务器健康状态.查看系统中所有进程及杀死进程.一般都可以采用 ...

  3. Linux学习笔记(16)-多线程

    什么是多线程?或者说,什么是线程? 按照书本上的描述,所谓线程,便是包含在进程内部的顺序执行流,是进程中实际运作的单位,也是操作系统能够进行调度的最小单位. 一个进程中可以并发多条线程,每条线程并行执 ...

  4. JZ2440学习笔记之第一个裸机程序(Keil-MDK)

    CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...

  5. Linux学习笔记 一 第一章 Linux 系统简介

    Linux简介 一.UNIX与Linux发展史

  6. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  7. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

  8. Linux 学习笔记之超详细基础linux命令 Part 13

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...

  9. (转)Linux最常用指令及快捷键 Linux学习笔记

    Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...

随机推荐

  1. Ajax无刷新提交表单和显示

    ajax无刷新表单提交:   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  2. 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则

    转载:http://space.itpub.net/17007506/viewspace-616852 腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室( ...

  3. Android学习之旅:五子棋

    在学完了Android的基础之后,我开始尝试着写一些小项目练练手,同时进一步巩固自己的基础知识,而我选的的第一个项目就是做一个简单的人人对战的五子棋小游戏. 首先,我们要新建一个自定义控件类Panel ...

  4. mysql的账户失效,之前的密码无法登录

     引用自:http://blog.sina.com.cn/s/blog_682c287b0100ofz8.html 此为linux服务器下的做法 方法一: 1.关闭mysql    # service ...

  5. 数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题

    从08年开始学习了sqlserver数据库之后,就一直以为sqlserver只有版本的区分,没有类型的差异:总以为从Sql2000. sql2005到sql2008.sql2012,微软出口的数据库, ...

  6. java remote debug

    1. java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar test.jar 2.会出现Listening for ...

  7. centos 彻底卸载mysql

    yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysq ...

  8. vi 替换字符串

    假如说我想把该文件中所有的Web替换成SOR_SYS,那么我们可以用vi打开该文件,然后按一下: 你的命令行的最后一行会出现:,这个时候就是提醒你输入替换的命令 %s/Web/SOR_SYS/g 按一 ...

  9. iOS-assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义 assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值 ...

  10. JVM学习笔记-运行时数据区

    不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...