POSIX 线程库,通常称为 Pthreads(POSIX Threads),是一个基于 POSIX 标准的多线程编程接口。它为多线程应用程序提供了一组标准化的 API,兼容多个 UNIX 系统,包括 Linux、macOS 等。
POSIX 线程库概览
POSIX 线程库主要包括以下几个组成部分:
- 线程管理:创建和操作线程。
- 线程同步:互斥锁(mutex)、读写锁(rwlock)、条件变量(condition variable)。
- 线程属性:属性对象允许设置线程的行为特性。
- 线程特定数据(Thread-Specific Data, TSD):为每个线程提供私有的数据存储。
POSIX 线程库主要函数
以下是一些主要的 Pthreads API 函数:
-
线程管理:
pthread_create
:创建一个新线程。pthread_exit
:终止调用线程。pthread_join
:等待线程结束,并可获取线程的返回值。pthread_detach
:将线程设置为分离状态。pthread_self
:获取当前线程的标识符。
-
互斥锁(mutex):
pthread_mutex_init
:初始化互斥锁。pthread_mutex_destroy
:销毁互斥锁。pthread_mutex_lock
:锁定互斥锁。pthread_mutex_unlock
:解锁互斥锁。
-
条件变量(condition variable):
pthread_cond_init
:初始化条件变量。pthread_cond_destroy
:销毁条件变量。pthread_cond_wait
:等待条件变量的信号。pthread_cond_signal
:发送信号给一个等待该条件变量的线程。pthread_cond_broadcast
:发送信号给所有等待该条件变量的线程。
-
读写锁(rwlock):
pthread_rwlock_init
:初始化读写锁。pthread_rwlock_destroy
:销毁读写锁。pthread_rwlock_rdlock
:获取读锁。pthread_rwlock_wrlock
:获取写锁。pthread_rwlock_unlock
:释放锁。
示例代码
下面的示例展示了如何使用 Pthreads 创建线程、使用互斥锁来同步线程对共享资源的访问、以及使用条件变量进行线程间通信。
示例:生产者-消费者模型
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFFER_SIZE 5
#define NUM_ITEMS 20
typedef struct {
int buffer[BUFFER_SIZE];
int in;
int out;
int count;
pthread_mutex_t mutex;
pthread_cond_t not_empty;
pthread_cond_t not_full;
} shared_data_t;
shared_data_t shared_data = {
.in = 0,
.out = 0,
.count = 0,
.mutex = PTHREAD_MUTEX_INITIALIZER,
.not_empty = PTHREAD_COND_INITIALIZER,
.not_full = PTHREAD_COND_INITIALIZER
};
void* producer(void *arg) {
for (int i = 0; i < NUM_ITEMS; i++) {
// 模拟生产
int item = i;
pthread_mutex_lock(&shared_data.mutex);
// 等待缓冲区不满
while (shared_data.count == BUFFER_SIZE) {
pthread_cond_wait(&shared_data.not_full, &shared_data.mutex);
}
// 将产品加入缓冲区
shared_data.buffer[shared_data.in] = item;
shared_data.in = (shared_data.in + 1) % BUFFER_SIZE;
shared_data.count++;
printf("Produced: %d\n", item);
// 通知消费线程缓冲区不空
pthread_cond_signal(&shared_data.not_empty);
pthread_mutex_unlock(&shared_data.mutex);
// 模拟生产间隔时间
usleep(rand() % 100000);
}
return NULL;
}
void* consumer(void *arg) {
for (int i = 0; i < NUM_ITEMS; i++) {
pthread_mutex_lock(&shared_data.mutex);
// 等待缓冲区不空
while (shared_data.count == 0) {
pthread_cond_wait(&shared_data.not_empty, &shared_data.mutex);
}
// 从缓冲区消费一个产品
int item = shared_data.buffer[shared_data.out];
shared_data.out = (shared_data.out + 1) % BUFFER_SIZE;
shared_data.count--;
printf("Consumed: %d\n", item);
// 通知生产线程缓冲区不满
pthread_cond_signal(&shared_data.not_full);
pthread_mutex_unlock(&shared_data.mutex);
// 模拟消费间隔时间
usleep(rand() % 150000);
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
// 创建生产者线程
if (pthread_create(&producer_thread, NULL, producer, NULL) != 0) {
fprintf(stderr, "Error creating producer thread\n");
return 1;
}
// 创建消费者线程
if (pthread_create(&consumer_thread, NULL, consumer, NULL) != 0) {
fprintf(stderr, "Error creating consumer thread\n");
return 1;
}
// 等待线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
pthread_mutex_destroy(&shared_data.mutex);
pthread_cond_destroy(&shared_data.not_empty);
pthread_cond_destroy(&shared_data.not_full);
return 0;
}
总结
POSIX 线程库提供了一组强大而灵活的 API 来进行多线程编程。通过理解和正确使用这些 API,你可以在应用程序中有效地进行并发编程,提高程序的性能和响应能力。上述的生产者-消费者示例演示了基本的线程创建、同步和通信技巧,适合于处理多线程环境下的共享资源问题。
标签:mutex,cond,pthread,iOS,132,POSIX,shared,线程,data From: https://www.cnblogs.com/chglog/p/18309173