pthread

pthread


作用

线程库实行了 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 );
执行 pthread_create,将创建线程,成功则返回 0, 否则返回 - 1;
参数 1 返回一个绑定特定函数的线程 ID;
参数 2 为线程属性对象指针,用来改变线程的属性;
参数 3 为线程运行的函数指针,被调用的函数必须返回空指针,且只能有一个空指针参数;
参数 4 为传递给被调用函数的参数;
以下为主线程中使用两个子线程的例子:


#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

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_join

函数 pthread_join 用来等待一个线程的结束, 线程间同步的操作。头文件 : #include <pthread.h>
函数定义: 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 来检索获取。

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

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

posted @ 2021-02-08 10:39  seekting  阅读(305)  评论(0)    收藏  举报