首页 关于 微信公众号
欢迎关注我的微信公众号

POSIX线程API

POSIX线程

POSIX线程是POSIX的线程标准,定义了创建和操纵线程的一套API。实现POSIX线程标准的库常被称作Pthreads,一般用于Unix-like POSIX 系统,如Linux、 Solaris。但是Microsoft Windows上的实现也存在,例如直接使用Windows API实现的第三方库pthreads-w32;而利用Windows的SFU/SUA子系统,则可以使用微软提供的一部分原生POSIX API。

API的具体内容

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

Pthreads API中大致共有100个函数调用,全都以”pthread_“开头,并可以分为四类:

POSIX的Semaphore API可以和Pthreads协同工作,但这并不是Pthreads的标准。因而这部分API是以”sem_“打头,而非”pthread_“。

数据类型

线程操纵函数

pthread_create()

功能

创建一个新线程。

简介

#include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

编译和链接使用 -pthread .

描述

pthread_create()函数在程序中开启一个新的线程。新线程启动执行通过调用 start_routine() 函数,arg 是传递给 start_routine() 的唯一参数。

新的线程被终止于下列方法之一:

attr是设置新创建线程的属性的,该属性可以使用 pthread_attr_init(3) 进行初始化。如果 attr 设置为 NULL,则创建的线程利用的就是默认的属性。

在返回之前,如果成功创建了一个线程,则线程的ID会在 thread指向的缓冲区中存储。

返回值

成功时,返回 0, 失败时返回错误码。

示例

#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>

/* prototype for thread routine */
void print_message_function ( void *ptr );

/* struct to hold data to be passed to a thread
 this shows how multiple data items can be passed to a thread */
typedef struct str_thdata
{
    int thread_no;
    char message[100];
} thdata;


int main(int argc,char *argv[])
{
    pthread_t thread1, thread2;  /* thread variables */
    thdata data1, data2;         /* structs to be passed to threads */
    
    /* initialize data to pass to thread 1 */
    data1.thread_no = 1;
    strcpy(data1.message, "Hello!");
    
    /* initialize data to pass to thread 2 */
    data2.thread_no = 2;
    strcpy(data2.message, "Hi!");
    
    /* create threads 1 and 2 */
    pthread_create (&thread1, NULL, (void *) &print_message_function, (void *) &data1);
    pthread_create (&thread2, NULL, (void *) &print_message_function, (void *) &data2);
    
    /* Main block now waits for both threads to terminate, before it exits
     If main block exits, both threads exit, even if the threads have not
     finished their work */
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    
    /* exit */
    exit(0);
} /* main() */

/**
 * print_message_function is used as the start routine for the threads used
 * it accepts a void pointer
 **/
void print_message_function ( void *ptr )
{
    thdata *data;
    data = (thdata *) ptr;  /* type cast to a pointer to thdata */
    
    /* do the work */
    printf("Thread %d says %s \n", data->thread_no, data->message);
    
    pthread_exit(0); /* exit */
} /* print_message_function ( void *ptr ) */

pthread_exit()

功能

终止正在运行的线程。

简介

#include <pthread.h>
void pthread_exit(void *retval);

pthread_cancel()

功能

向一个线程发送取消请求。

简介

#include <pthread.h>
int pthread_cancel(pthread_t thread);

描述

pthread_cancel() 函数向一个线程发送一个取消请求。目标线程什么时候回应以及回不回应取决于线程的两个属性:cancelability state 和 type.

线程的 cancelability state 取决于 pthread_setcancelstate(3),这个属性可以被设置为 enabled 和 disabled. 如果一个线程的 cancelability state 属性是 enabled 的,那么一个此时该线程如果接收到取消请求才有效。

发送成功并不意味着线程会终止。

若是在整个程序退出时,要终止各个线程,应该在成功发送 cancel 指令后,使用 pthread_join()函数,等待指定的线程硬完全退出之后,再继续执行;否则,很容易产生“段错误”。

返回值

成功则返回0,不成功则返回非0 。

pthread_join()

功能

等待一个线程的结束,线程间同步的操作。

简介

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);

描述

pthread_join()函数,以阻塞的方式等待thread指定的线程结束,当函数返回时,被等待的线程资源被收回。如果线程已经结束,那么该函数会立即返回,并且thread指定的线程必须是joinable的。

返回值

成功则返回0,不成功则返回错误码。

pthread_kill()

pthread_cleanup_push()

####返回值

线程属性函数

mutex函数

条件变量函数

同步屏障函数

工具函数

共享内存函数

Blog

Opinion

Project