多线程

来源:互联网 发布:阿里巴巴 借壳 数据港 编辑:程序博客网 时间:2024/06/16 07:55

多任务处理的两种类型

  • 基于进程:程序的并发执行.简单说就是把一份代码复制成多份,并让它们同时执行。进程间通信就是为了让它们有序的运行。

  • 基于线程:同一程序的片段的并发执行.简单说就是让多个函数同时执行,每个函数称为一个线程,线程定义了一个单独的执行路径。线程间通信是为了让它们有序的运行。

Pthread(POSIX threads)

Pthreads定义了一套C语言的类型、函数与常量,它以pthread.h头文件和一个线程库实现。

数据类型

  • pthread_t:线程ID
  • 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():向线程发送一个信号

同步函数编辑(用于 mutex 和条件变量)

  • 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_attr_getschedparam();获取线程优先级
  • pthread_attr_setschedparam();设置线程优先级

工具函数

  • pthread_equal(): 对两个线程的线程标识号进行比较
  • pthread_detach(): 分离线程
  • pthread_self(): 查询线程自身线程标识号

创建线程

  • 头文件
#include <pthread.h>
  • 函数声明
int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,(void*)(*start_rtn)(void*), void *arg);
  • 参数
    tidp: 指向线程标识符的指针,线程创建成功时,tidp指向的内存单元被设置为新创建线程的线程ID。
    attr: 设置线程属性。
    (start_rtn)(void): 线程运行函数的起始地址。
    arg: 运行函数的参数。

  • 编译链接参数

- lpthread
  • 返回值
    线程创建成功,返回0。
    线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。

返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

终止线程

#include<pthread.h>pthread_exit(status);

pthread_exit 用于显式地退出一个线程。通常情况下,pthread_exit() 函数是在线程完成工作后无需继续存在时被调用。
如果 main() 是在它所创建的线程之前结束,并通过 pthread_exit() 退出,那么其他线程将继续执行。否则,它们将在 main() 结束时自动被终止。

连接和分离线程

我们可以使用以下两个函数来连接或分离线程:

pthread_join (threadid, status) pthread_detach (threadid)

pthread_join() 子程序阻碍调用程序,直到指定的 threadid 线程终止为止。当创建一个线程时,它的某个属性会定义它是否是可连接的(joinable)或可分离的(detached)。只有创建时定义为可连接的线程才可以被连接。如果线程创建时被定义为可分离的,则它永远也不能被连接。

原创粉丝点击