Linux多线程程序设计学习笔记
2014-02-15 15:08
453 查看
1.什么是线程,线程与进程之间的关系
2.创建线程
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create:
//若线程创建成功,则返回0。若线程创建失败,则返回出错编号
//编译时需要调用libpthread
3.实例代码
4.编译实例
gcc pthread_creat.c -o pthread_creat -lpthread
5.线程终止
(1)执行完成后隐式退出;
(2)由线程本身显示调用pthread_exit 函数退出;
(3)被其他线程用pthread_cance函数终止: // 在某线程中调用此函数,可以终止由参数thread 指定的线程。
6.线程等待
如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程I
D为参数thread的线程终止。
函数定义: int pthread_join(pthread_t
thread, void **retval);
thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。
7.pthread文件相关总结
数据类型
pthread_t:线程句柄
pthread_attr_t:线程属性
操纵函数:
pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号
同步函数
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
工具函数
pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self():
查询线程自身线程标识号
8.多线程编程实例
//产生的结果就是先执行id那个进程,之后才会执行下面的for循环。
2.创建线程
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create:
//若线程创建成功,则返回0。若线程创建失败,则返回出错编号
//编译时需要调用libpthread
3.实例代码
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> voidprintids(constchar *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); //也可以通过这种方式,在创建后得到自身的进程ID printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid, (unsignedint) tid, (unsigned int) tid); } void*thr_fn(void*arg) //注意函数类型 { printids("new thread: "); returnNULL; } intmain(void) { interr; pthread_t ntid; //进程ID err = pthread_create(&ntid, NULL, thr_fn, NULL); if(err != 0) printf("can't create thread: %s\n",strerror(err)); printids("main thread:"); pthread_join(ntid,NULL); //后面介绍这个函数 returnEXIT_SUCCESS; }
4.编译实例
gcc pthread_creat.c -o pthread_creat -lpthread
5.线程终止
(1)执行完成后隐式退出;
(2)由线程本身显示调用pthread_exit 函数退出;
(3)被其他线程用pthread_cance函数终止: // 在某线程中调用此函数,可以终止由参数thread 指定的线程。
6.线程等待
如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程I
D为参数thread的线程终止。
函数定义: int pthread_join(pthread_t
thread, void **retval);
thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。
7.pthread文件相关总结
数据类型
pthread_t:线程句柄
pthread_attr_t:线程属性
操纵函数:
pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号
同步函数
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
工具函数
pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self():
查询线程自身线程标识号
8.多线程编程实例
//Threads.cpp #include <iostream> #include <unistd.h> #include <pthread.h>
using namespace std; void *thread(void *ptr) { for(int i = 0;i < 3;i++) { sleep(1); cout << "This is a pthread." << endl; } return 0; } int main() { pthread_t id; int ret = pthread_create(&id, NULL, thread, NULL); if(ret) { cout << "Create pthread error!" << endl; return 1; } pthread_join(id, NULL); for(int i = 0;i < 3;i++) { cout << "This is the main process." << endl; sleep(1); } return 0; }
//产生的结果就是先执行id那个进程,之后才会执行下面的for循环。
相关文章推荐
- 人工智能程序设计(Visual Prolog) 学习笔记
- 学习《.net框架 程序设计》学习笔记---委托(一)
- js-JavaScript高级程序设计学习笔记19
- JAVA学习笔记------程序设计基础部分
- C++程序设计语言特别版 学习笔记(0)
- Core Java学习笔记摘录系列--第3章 Java的基本程序设计结构
- java学习笔记图形程序设计及GUI应用小结(3)
- JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
- JavaScript高级程序设计(第3版)学习笔记 概述
- js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法
- Java学习笔记----事件驱动程序设计
- C++primer学习笔记----面向对象程序设计(2)
- JavaScript高级程序设计(第3版)学习笔记11 内建js对象
- 【HTML5】HTML5 高级程序设计 学习笔记1 HTML5新特性简介
- JavaScript高级程序设计-学习笔记1 (第一章--第四章)
- 《Windows Phone 7 程序设计》学习笔记(四)
- JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺
- 学习java script 高级程序设计第三版笔记(一)
- 关于LUA程序设计对象序列化学习笔记
- Linux程序设计学习笔记----System V进程通信(共享内存)