多线程程序设计
头文件:pthread.h
连接时需要用到的库文件:libpthread.a
创建线程
函数原型
#include <pthread.h>
int pthread_creat(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)
tidp:线程id
attr:线程属性
start_trn:线程要执行的函数
arg: start_rtn的参数
编译
由于pthread库不是linux系统的库,编译时要加上-lpthread
示例代码如下:
gcc filename -lthread
示例代码如下:
thread_create.c 线程的创建
#include <pthread.h>
#include <stdio.h>
void *myThread1(void){
int i;
for(i=0;i<100;i++){
printf("this is the first pthread,created by zieckey.\n");
sleep(1);
}
}
void *myThread2(void){
int i;
for(i=0;i<100;i++){
printf("this is the second pthread,created by zieckey.\n");
sleep(1);
}
}
int main(){
int i=0,ret=0;
pthread_t id1,id2;
/*创建线程1*/
ret=pthread_create(&id1,NULL,(void*)myThread1,NULL);
if(ret){
printf("create pthread error!\n");
return 1;
}
/*创建线程2*/
ret=pthread_create(&id2,NULL,(void*)myThread2,NULL);
if(ret){
printf("create pthread error!\n");
return 1;
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
编译执行结果:
[retacn@localhost app]$ gcc thread_create.c -lpthread -o thread_create
[retacn@localhost app]$ ./thread_create
this is the first pthread,created by zieckey.
this is the second pthread,created by zieckey.
this is the first pthread,created by zieckey.
this is the second pthread,created by zieckey.
thread_int.c 传递一个整型参数
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *create(void *arg){
int *num;
num=(int *)arg;
printf("create parameter is %d \n",*num);
return (void *)0;
}
int main(int argc,char *argv[]){
pthread_t tidp;
int error;
int test=4;
int *attr=&test;
error=pthread_create(&tidp,NULL,create,(void *)attr);
if(error){
printf("pthread_create is create is not createed ...\n");
return -1;
}
sleep(1);
printf("pthread_create is created...\n");
return 0;
}
编译执行结果:
[retacn@localhost app]$ gcc thread_int.c -lpthread -o thread_int
[retacn@localhost app]$ ./thread_int
create parameter is 4
pthread_create is created...
thread_string.c
thread_struct.c
thread_share.c
示例代码如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=1;//变量位于数据段中
void *create(void *arg){
printf("new pthread...\n");
printf("a=%d \n",a);
return (void *)0;
}
int main(int argc,char *argv[]){
pthread_t tidp;
int error;
int a=5;//变量位于栈中
printf("main first a=%d \n",a);
error=pthread_create(&tidp,NULL,create,NULL);
if(error!=0){
printf("new thread is not create...\n");
return -1;
}
sleep(1);
printf("main second a=%d\n",a);
printf("new thread is created...\n");
return 0;
}
编译执行结果为:
[retacn@localhost app]$ gcc thread_share.c -lpthread -o thread_share
[retacn@localhost app]$ ./thread_share
main first a=5
new pthread...
a=1
main second a=5
new thread is created...
线程的终止
进程中的任何一个线程调用exit或_exit,整个进程都会终止
线程的正常退出方式有:
线程从启动例程中返回
线程可以被另一个进程终止
线程自已调用pthread_exit函数
函数原型:
#include <pthread.h>
void pthread_exit(void *rval_ptr);
val_ptr:线程退出返回值的指针
示例代码如下:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *create(void *arg){
printf("new thread is create!\n");
return (void *)0;
}
int main(int agrc,char *argv[]){
pthread_t tid;
int error;
void *temp;
error=pthread_create(&tid,NULL,create,NULL);
printf("main thread!\n");
if(error){
printf("thread is not created!\n");
return -1;
}
error=pthread_join(tid,&temp);
if(error){
printf("thread is not exit!\n");
return -2;
}
printf("thread is exit code %d\n",(int)temp);
return 0;
}
编译执行程序结果如下:
[retacn@localhost app]$ gcc thread_exit.c -lpthread -o thread_exit
[retacn@localhost app]$ ./thread_exit
main thread!
new thread is create!
thread is exit code 0
线程等待
阻塞调用线程,直到指定的线程终止
#include <pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)
tid: 等待退出的线程id
rval_ptr: 线程退出的返回值的指针
示例代码如下:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void *thread(void *str){
int i;
for(i=0;i<10;i++){
sleep(2);
printf("this in the thread :%d\n",i);
}
return NULL;
}
int main(){
pthread_t pth;
int i;
int ret=pthread_create(&pth,NULL,thread,(void *)(i));
pthread_join(pth,NULL);
printf("123\n");
for(i=0;i<10;++i){
sleep(1);
printf("this in the main:%d\n",i);
}
return 0;
}
编译执行结果如下:
[retacn@localhost app]$ gcc thread_join.c -lpthread -o thread_join
[retacn@localhost app]$ ./thread_join
this in the thread :0
this in the thread :1
this in the thread :2
this in the thread :3
this in the thread :4
this in the thread :5
this in the thread :6
this in the thread :7
this in the thread :8
this in the thread :9
123
this in the main:0
this in the main:1
this in the main:2
this in the main:3
this in the main:4
this in the main:5
this in the main:6
this in the main:7
this in the main:8
this in the main:9
线程标识:
取得调用线程的thread identifier
函数原型如下:
#include <pthread.h>
pthread_t pthread_self(void)
示例代码如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *create(void *arg){
printf("new thread...\n");
printf("this thread's id is %u\n",(unsigned int)pthread_self());
printf("the process's pid is %d\n",getpid());
return (void *)0;
}
int main(int argc,char *argv[]){
pthread_t tid;
int error;
printf("main thread is starting...\n");
error=pthread_create(&tid,NULL,create,NULL);
if(error){
printf("thread is not created..\n");
return -1;
}
printf("the main process's pid is %d\n",getpid());
sleep(1);
return 0;
}
编译执行结果如下:
[retacn@localhost app]$ gcc thread_id.c -lpthread -o thread_id
[retacn@localhost app]$ ./thread_id
main thread is starting...
the main process's pid is 22475
new thread...
this thread's id is 3086752656
the process's pid is 22475
清除
线程终止有两种方式:
正常终止
非正常终止
以上两种方式终止前都要对占用资源进行释放
从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止
动作都会执行pthread_cleanup_push()所指定的清理函数
注:return 不会执行pthread_cleanup_push()所指定的清理函数
有点try catch的味道
函数原型
将清除函数压入清除栈
#include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *),void *arg)
rtn:清除函数
arg:清除函数的参数
将清除函数弹出清除栈
#include <pthread.h>
void pthread_cleanup_pop(int execute)
execute:是否在弹出清理函数的同时执行该函数
非0:执行
0: 不执行
示例代码如下:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *clean(void *arg){
printf("cleanup: %s\n",(char *)arg);
return (void *)0;
}
void *thr_fn1(void *arg){
printf("threan 1 start\n");
pthread_cleanup_push((void *)clean,"thread 1 first handler");
pthread_cleanup_push((void *)clean,"thread 1 second handler");
printf("thread 1 push complete\n");
if(arg){
return ((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
void *thr_fn2(void *arg){
printf("thread 2 is start!\n");
pthread_cleanup_push((void *)clean,"thread 2 first handler");
pthread_cleanup_push((void *)clean,"thread 2 second handler");
printf("thread 2 push complete\n");
if(arg){
pthread_exit((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void){
int err;
pthread_t tid1,tid2;
void *tret;
err=pthread_create(&tid1,NULL,thr_fn1,(void *)1);
if(err!=0){
printf("error...\n");
return -1;
}
err=pthread_create(&tid2,NULL,thr_fn2,(void *)1);
if(err!=0){
printf("error...\n");
return -1;
}
err=pthread_join(tid1,&tret);
if(err!=0){
printf("error...\n");
return -1;
}
printf("thread 1 exit code:%d\n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0){
printf("error...\n");
return -1;
}
printf("thread 2 exit code:%d\n",(int)tret);
return 0;
}
编译执行结果如下:
[retacn@localhost app]$ gcc thread_clean.c -lpthread -o thread_clean
[retacn@localhost app]$ ./thread_clean
threan 1 start
thread 1 push complete
thread 1 exit code:1
thread 2 is start!
thread 2 push complete
cleanup: thread 2 second handler
cleanup: thread 2 first handler
thread 2 exit code:2
- 浏览: 263814 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2433Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1326U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1141Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1287链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1041DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 962Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2185安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1369linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 891linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 755字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记三
2013-04-04 14:03 791memdev.h文件示例代码如下: #ifndef _MEM ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 590竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 814用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83812m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1170串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10821 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 975嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 428画个草图也挺过瘾 -
进程间通信学习笔记一(管道通信)
2013-02-01 20:08 1420进程间通信(ipc) 应用场景: 数据传输 资源共享 通知事件 ... -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 795信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ...
相关推荐
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
【UNIX多线程学习笔记】 在UNIX操作系统中,多线程是一种重要的编程模型,它允许多个执行流在单个进程中并发运行。多线程带来了许多优势,包括提高应用程序响应速度,充分利用多CPU系统的资源,以及优化程序结构,...
这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...
java基础:多线程学习笔记
多线程 学习笔记.md
本篇笔记将深入探讨多线程的各个方面,包括其定义、作用以及如何在Windows环境中进行多线程编程。 首先,进程和线程是操作系统中的基本执行单位。进程是程序的实例,拥有独立的虚拟内存空间和系统资源,当进程结束...
java学习笔记2(多线程)java学习笔记2(多线程)
本篇学习笔记主要涵盖了线程基础、threading模块的使用以及线程同步控制。 首先,线程是操作系统分配CPU执行时间的基本单位,一个进程可以包含多个线程。在Python3中,线程的状态主要包括新建、就绪、运行、死亡、...
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
在计算机科学中,多线程是一种编程模型,允许一个应用程序同时执行多个任务。这提高了系统的效率,特别是对于处理大量并发操作的情况。以下是一些关于多线程的重要知识点,特别是关于在Linux和Windows环境下创建和...
在多线程编程中,进程和线程是两个核心概念。进程是操作系统资源分配的基本单位,每个独立执行的程序都对应一个进程。而线程则是程序执行的最小单元,是进程内部的一条执行路径。多线程是指在一个应用程序中存在多个...
在这个学习笔记中,主要讨论了Java中的线程同步机制,包括volatile关键字、synchronized以及Lock接口,特别是ReentrantLock的使用。 首先,对于线程1和线程2的疑惑,调试(debug)模式并不能改变线程的执行顺序。...
Java多线程是Java编程中的核心概念,它允许并发执行多个任务,提高程序的执行效率。以下是关于Java多线程的详细知识点: 1. **创建线程** - **继承Thread类**:创建一个新的类,该类继承自Thread类,并重写run()...
Java多线程学习笔记之自定义线程池 本篇文章主要介绍了Java多线程学习笔记之自定义线程池,通过深入了解ThreadPoolExecutor这个核心类,我们可以自定义线程池,满足不同的线程池需求。 Java多线程学习笔记之自定义...
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...