首页 > 其他分享 >iOS开发基础132-POSIX线程库

iOS开发基础132-POSIX线程库

时间:2024-07-18 11:44:24浏览次数:10  
标签:mutex cond pthread iOS 132 POSIX shared 线程 data

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,你可以在应用程序中有效地进行并发编程,提高程序的性能和响应能力。上述的生产者-消费者示例演示了基本的线程创建、同步和通信技巧,适合于处理多线程环境下的共享资源问题。

标签:mutex,cond,pthread,iOS,132,POSIX,shared,线程,data
From: https://www.cnblogs.com/chglog/p/18309173

相关文章

  • iOS开发基础131-isa指针
    iOS中isa指针是Objective-C对象内部的一个重要概念,它是实现对象与类之间关系的核心机制。深入理解isa指针对掌握Objective-C的底层运行机制和对象模型非常重要。1.什么是isa指针每个Objective-C对象都有一个isa指针,它指向这个对象所属的类。类本身也有一个isa指针,指向其元类(met......
  • iOS开发基础129-音频录制上传
    在Objective-C中,音频录制过程涉及几个关键步骤,包括配置录音设置、创建和启动录音机、处理录音会话以及将录制的音频文件上传到服务器。下面是一个详细的示例,包括创建一个简单的音频录制应用,以及将录制的音频文件上传到服务器的代码。1.设置音频会话我们需要使用AVFoundation框......
  • iOS开发基础127-深入探讨KVO
    一、基础KVO(Key-ValueObserving,键值观察)是Cocoa提供的一种机制,它允许我们观察属性的变化并做出响应。这种机制非常强大,广泛应用于各种编程场景,如数据绑定、状态变化监控等。在深入了解KVO之前,我们先从KVO的基本概念开始,然后逐步探讨其深层次应用和一些使用实践的注意事项......
  • 在 PowerShell 中Get-WmiObject Win32_PhysicalMemory,SMBIOSMemoryType 是一种用于描
    在PowerShell中Get-WmiObjectWin32_PhysicalMemory,SMBIOSMemoryType是一种用于描述系统中物理内存类型的属性。数字26表示特定的内存类型,具体为DDR4内存。每种内存类型在SMBIOS(SystemManagementBIOS)规范中都有一个对应的数字码,用来标识不同类型的内存。以下是一些常见......
  • iOS开发基础125-深入探索SDWebImage
    SDWebImage是一个流行的用于处理图像下载和缓存的库,广泛用于iOS开发中,提供了一系列方便的API来下载和缓存图像,以提高应用的性能和用户体验。以下是对其进行详细介绍和分析,包括其原理和底层实现。一、SDWebImage的主要功能图像下载和缓存:图像下载:使用异步方式从网络上下......
  • iOS开发基础124-RunLoop实现卡顿检测
    利用RunLoop实现卡顿检测的基本思路是通过监听RunLoop的状态变化来判断主线程的执行时长。如果RunLoop在某个状态停留的时间超过了预设的时间阈值,则认为发生了卡顿。在具体实现中,可以利用CFRunLoopObserver来监听RunLoop的状态变化,并记录时间差。一、卡顿检测的基本原......
  • iOS开发基础122-RunLoop
    深入探讨RunLoop的底层实现需要了解CoreFoundation框架中的CFRunLoop以及与RunLoop工作机制紧密相关的操作系统底层API。这些底层实现主要涉及到事件源、定时器和线程的调度机制。本文将深入剖析RunLoop的底层结构及其运行流程。一、RunLoop底层数据结构涉及RunLo......
  • iOS开发基础123-自动释放池
    自动释放池(AutoreleasePool)是Objective-C中用于管理内存的一个重要机制,它帮助开发者简化内存管理的工作。自动释放池的核心概念是将对象放入池中,在某个时刻由系统统一释放这些对象。这种机制在iOS和macOS的应用开发中广泛使用,尤其是在事件循环和线程运行时。为了深入理解其底层......
  • vue请求接口常用写法(axios)
    1.项目根目录下新建一个utils文件夹,并新建一个request.js文件(注意:是以axios方法请求的,所以需要先安装axios或cdn引入)安装:npmnpminstallaxios-Syarnyarnaddaxios-Scdn<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>&&配置代码imp......
  • iOS开发基础119-组件化
    一、引言组件化是将应用程序分解成多个独立模块的设计方法,这些模块可以单独开发、测试和维护。对于大型iOS项目,组件化能够提高开发效率、降低耦合、增加代码复用性,并且使项目更易维护。本文将详细介绍如何在iOS项目中实现组件化,包括本地组件管理和远程组件管理。二、为什么......