iOS开发基础132-POSIX线程库

POSIX 线程库,通常称为 Pthreads(POSIX Threads),是一个基于 POSIX 标准的多线程编程接口。它为多线程应用程序提供了一组标准化的 API,兼容多个 UNIX 系统,包括 Linux、macOS 等。

POSIX 线程库概览

POSIX 线程库主要包括以下几个组成部分:

  1. 线程管理:创建和操作线程。
  2. 线程同步:互斥锁(mutex)、读写锁(rwlock)、条件变量(condition variable)。
  3. 线程属性:属性对象允许设置线程的行为特性。
  4. 线程特定数据(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,你可以在应用程序中有效地进行并发编程,提高程序的性能和响应能力。上述的生产者-消费者示例演示了基本的线程创建、同步和通信技巧,适合于处理多线程环境下的共享资源问题。

posted @ 2024-07-18 11:32  Mr.陳  阅读(2)  评论(0编辑  收藏  举报