Linux线程的基本函数

常用线程函数

  • pthread_create 创建一个线程
  • pthread_exit 线程自行退出
  • pthread_join 其它线程等待某一个线程退出
  • pthread_cancel 其它线程强行杀死某一个线程

pthread线程库的使用
在源码中使用头文件 pthread.h
用gcc链接时加上 -lpthread 选项,链接线程库

pthread_create 函数

int pthread_create( 
	pthread_t *thread ,
	const pthread_attr_t *attr,
	void*(*start_rtn)(void*),
	void *  arg);/*
参数1:产生线程的标识符
参数2:所产生线程的属性,通常设为NULL
参数3:新的线程所执行的函数
参数4:新的线程函数的参数
函数返回值:若线程创建成功则返回0,否则返   回-1.
*/

pthread_join 函数

int pthread_join( 
	pthread_t  thread ,
	void **value_ptr);/*
参数1:等待线程的标识符
参数2:用户定义的指针,用来存储被等待线程的返回值
函数返回值:若执行成功则返回0,失败返回错误号
如果一个线程要等待另一个线程的终止,则使用该函数
*/

线程同步与互斥

同步互斥机制提供了三种方法

  • 互斥锁
  • 条件变量
  • 信号量

线程锁

互斥量

  • 互斥量使用特定的数据类型:pthread_mutex_t
  • 互斥量使用前要初始化,初始化函数:
  • pthread_mutex_init
  • 互斥量使用结束,要对它进行撤销,撤销函数:
  • pthread_mutex_destroy

互斥锁操作相关函数

  • pthread_mutex_init: 互斥量初始化
  • pthread_mutex_lock: 互斥量加锁
  • pthread_mutex_unlock: 释放互斥锁
  • pthread_mutex_destroy: 释放互斥锁资源
  • 使用互斥锁对临界区进行操作的方法:
  • 使用函数pthread_mutex_lock进行加锁
  • 临界区操作
  • 使用函数pthread_mutex_unlock释放互斥锁

信号量

  • 信号量的数据类型为sem_t
  • #include
  • 相关函数:
  • sem_init
  • sem_wait
  • sem_post
  • sem_destroy
sem_init函数
int sem_init (
	sem_t *sem, int pshared,
	unsigned int value);/*
参数1: 待初始化的信号量
参数2: 信号量的类型。如果值为0,表示是当前进程的局部信号量,否则是其它进程可以共享该信号量。 LINUX线程一般不支持进程间共享信号量,该值设为0.
参数3:信号量的初始值。
调用成功时返回0,失败返回-1.
*/

sem_wait函数
int sem_wait(sem_t * sem);/*
参数: 由sem_init调用初始化的信号量对象的指针
sem的值减1
等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。
成功返回0,失败返回-1
*/

sem_post函数
int sem_post(sem_t * sem);/*
参数: 由sem_init调用初始化的信号量对象的指针
释放信号量,让信号量的值加1。相当于V操作。 
*/

sem_destroy函数
int sem_destroy(sem_t * sem);/*
参数: 由sem_init调用初始化的信号量对象的指针
归还自己占据的一切资源。
在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。
*/

信号量使用方法

  • 声明一个信号量sem_t my_sem;
  • 初始化信号量sem_init(& my_sem,0,1);
  • sem_post和sem_wait函数配合使用来达到线程同步
  • 释放信号量int sem_destroy (& my_sem);