pthread使用方法

pthread

  • 作用
  • pthread_join
  • pthread_exit

作用

线程库实行了POSIX线程标准通常称为Pthreads。POSIX线程具有很好的可移植性,使用pthreads编写的代码可运行于Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthreads-win32可供使用。

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

数据类型
pthread_t:线程ID(线程标识符,用于声明线程ID)
pthread_attr_t:线程属性
1

操纵函数
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(): 对两个线程的线程标识号进行比较
(int pthread_equal ( pthread_t t1 , pthread_t t2); 比较两个线程ID是否相同)
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号

(pthread_t pthread_self( void ); 获取自身线程ID)

例子:int pthread_create ( pthread_t *thread , const pthread_attr_t *attr , void *(start)(void) , void *arg );

  1. 执行pthread_create,将创建线程,成功则返回0,否则返回-1;
  2. 参数1返回一个绑定特定函数的线程ID;
  3. 参数2为线程属性对象指针,用来改变线程的属性;
  4. 参数3为线程运行的函数指针,被调用的函数必须返回空指针,且只能有一个空指针参数;
  5. 参数4为传递给被调用函数的参数;

以下为主线程中使用两个子线程的例子:

#include 
#include 
#include 
#include 
#include 

using namespace std;

void *myThreadID1(void*)
{
        cout<<"thread_ID1"<<"\n";
}

void *myThreadID2(void*)
{
        cout<<"thread_ID2"<<"\n";
}

int main()
{
        int i =0 ,ret = 0;
        pthread_t id1,id2;//声明线程ID

        ret = pthread_create(&id1 , NULL ,  myThreadID1, NULL); //创建并执行线程id1
        if(ret == -1){
                printf("Create pthread error!\n");
                return 1;
        }

        ret = pthread_create(&id2 , NULL ,  myThreadID2, NULL); //创建并执行线程id2
        if(ret == -1){
                printf("Create pthread error!\n");
                return 1;
        }

        pthread_join( id1 , NULL );  //阻塞主线程,直到id1结束才接触,
        pthread_join( id2 , NULL );

        cout<<"all thread done!";
        return 0;
}

pthread使用方法_第1张图片

pthread_join

函数pthread_join用来等待一个线程的结束,线程间同步的操作。头文件 : #include
函数定义: int pthread_join(pthread_t thread, void **retval);
描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。pthread_join用于等待一个线程的结束,也就是主线程中要是加了这段代码,就会在加代码的位置卡主,直到这个线程执行完毕才往下走。
参数 :thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。

pthread_exit

线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。
功能:使用函数pthread_exit退出线程,这是线程的主动行为;由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数来同步并释放资源。
pthread_exit用于强制退出一个线程(非执行完毕退出),一般用于线程内部。
说明:retval:pthread_exit()调用线程的返回值,可由其他函数如pthread_join来检索获取。2


  1. [link](https://baike.sogou.com/v10119989.htm?fromTitle=pthread_attr_t ). ↩︎

  2. pthread_join\pthread_exit 联系与区别(https://blog.csdn.net/androidbbc/article/details/51479682)
    (pthread_join: https://blog.csdn.net/dinghqalex/article/details/42921931 ) ↩︎

你可能感兴趣的:(概念总结,计算机操作系统)