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);

标签: Linux, 线程, pthread, 函数, 操作系统, 信号量, sem, 互斥

相关文章推荐

添加新评论,含*的栏目为必填