1. 简介
POSIX是Portable Operating System Interface(可移植操作系统接口)的缩写,是UNIX系统与操作系统的标准规范。POSIX线程库是POSIX规范中定义的一组API,用于在多线程环境下开发应用程序。这些API允许程序员创建、管理和同步多个线程,以便有效地利用多核处理器的计算能力。
2. POSIX线程库的组成
2.1 头文件
POSIX线程库的头文件包含了多个常量、类型和函数原型,这些函数原型允许程序员使用POSIX线程库的API。这些头文件都以“pthread”开头,例如:
#include <pthread.h>
pthread.h是使用POSIX线程库的基本头文件,定义了创建、管理、同步、销毁线程的函数和数据结构。
2.2 函数
POSIX线程库的函数可分为四类:
线程管理函数:包括创建线程、结束线程和线程同步等函数。
线程属性函数:用于设置和获取线程属性。
线程取消函数:用于取消一个线程的执行。
线程特定数据函数:用于处理线程特定数据。
2.3 数据类型和常量
POSIX线程库定义了多个数据类型和常量,以支持线程编程,例如:
pthread_t:线程ID
pthread_attr_t:线程属性
pthread_mutex_t:互斥锁
pthread_cond_t:条件变量
PTHREAD_MUTEX_INITIALIZER:互斥锁的静态初始化常量
PTHREAD_COND_INITIALIZER:条件变量的静态初始化常量
3. POSIX线程库的基本应用
下面介绍POSIX线程库的基本应用——创建和同步线程。
3.1 创建线程
在POSIX线程库中,创建线程的函数为pthread_create(),它有四个参数:
pthread_t *thread:线程ID
const pthread_attr_t *attr:线程属性
void *(*start_routine)(void*):线程执行的函数
void *arg:传递给start_routine()函数的参数
下面是一个简单的例子:
#include <pthread.h>
#include <stdio.h>
void *print_message(void *ptr);
int main()
{
pthread_t thread;
char *message = "Hello, World!";
int ret;
ret = pthread_create(&thread, NULL, print_message, (void*)message);
if (ret) {
printf("pthread_create failed, return code=%d\n", ret);
return 1;
}
printf("Created thread ID %lu\n", thread);
pthread_join(thread, NULL);
return 0;
}
void *print_message(void *ptr)
{
char *message = (char*)ptr;
printf("%s\n", message);
pthread_exit(NULL);
}
在上面的例子中,我们首先定义了一个线程ID:pthread_t thread。接着我们定义了一个字符串指针message,传递给print_message()函数。我们使用pthread_create()函数创建了一个线程,该线程执行print_message()函数。最后,我们使用pthread_join()函数同步线程,等待print_message()函数执行完成并退出。
3.2 同步线程
POSIX线程库支持多种线程同步机制,如互斥锁、条件变量等。下面介绍互斥锁的基本使用方法。
3.2.1 互斥锁
互斥锁是POSIX线程库中最常用的同步机制之一。它提供了一种排他访问的方式,在同一时间只允许一个线程访问临界资源。当一个线程获得了互斥锁后,其他线程试图获取锁时会被阻塞,直到锁被释放。
互斥锁的使用方法如下:
初始化互斥锁:pthread_mutex_init()
加锁:pthread_mutex_lock()
解锁:pthread_mutex_unlock()
销毁互斥锁:pthread_mutex_destroy()
下面是一个简单的例子:
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *print_message(void *ptr);
int main()
{
pthread_t threads[10];
char *messages[10] = {
"Thread 1",
"Thread 2",
"Thread 3",
"Thread 4",
"Thread 5",
"Thread 6",
"Thread 7",
"Thread 8",
"Thread 9",
"Thread 10"
};
int ret;
int i;
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < 10; i++) {
ret = pthread_create(&threads[i], NULL, print_message, (void*)messages[i]);
if (ret) {
printf("pthread_create failed, return code=%d\n", ret);
return 1;
}
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
void *print_message(void *ptr)
{
char *message = (char*)ptr;
pthread_mutex_lock(&mutex);
printf("%s\n", message);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
在上面的例子中,我们通过一个for循环创建了10个线程。每个线程执行print_message()函数,它访问了一个临界资源——标准输出。我们使用了互斥锁来保护这个临界资源,这样每次只有一个线程能够访问。最后,我们使用pthread_join()函数等待所有线程执行结束。
4. 总结
POSIX线程库提供了一组API,使程序员能够在多线程环境下编写应用程序。其中包括线程管理、线程同步等函数和数据结构。互斥锁是其中最常用的同步机制之一,它提供了一种访问临界资源的方式,保证同一时间只有一个线程访问。