iOS开发基础132-POSIX线程库
1.iOS开发基础77-一像素线的几种实现方式2.iOS开发基础78-iOS 国际化3.iOS开发基础82-关于iOS目录4.iOS开发基础81-Runtime实战5.iOS开发基础80-关于Xcode86.iOS开发基础79-强制退出程序7.iOS开发基础90-密码学8.iOS开发基础89-Runloop9.iOS开发基础88-涂鸦效果10.iOS开发基础87-抽屉效果11.iOS开发基础86-FMDB12.iOS开发基础85-线程dispatch apply13.iOS开发基础84-HTTP请求方法详解与增删改查的应用14.iOS开发基础83-线程组15.iOS开发基础106-Instruments16.iOS开发基础105-Xcode收集Crashs的各种方法17.iOS开发基础104-正向代理和反向代理18.iOS开发基础103-APP之间跳转19.iOS开发基础102-后台保活方案20.iOS开发基础101-指纹和面部识别21.iOS开发基础100-MDM证书申请流程22.iOS开发基础99-iOS 内购的防范与优化23.iOS开发基础98-跳转淘宝案例24.iOS开发基础97-应用内购(In-App Purchase)的安全性解析与收据处理流程25.iOS开发基础96-UI类继承关系图26.iOS开发基础95-程序内评价27.iOS开发基础94-xcode1028.iOS开发基础93-GCD死锁29.iOS开发基础92-线程保活30.iOS开发基础91-线程同步技术与资源共享详解31.iOS开发基础138-视频编码32.iOS开发基础137-音视频编解码简介33.iOS开发基础136-防暴力点击34.iOS开发基础135-Core Data35.iOS开发基础134-异步并行上传问题36.iOS开发基础133-崩溃预防
37.iOS开发基础132-POSIX线程库
38.iOS开发基础131-isa指针39.iOS开发基础130-视频录制上传40.iOS开发基础129-音频录制上传41.iOS开发基础128-应用本地化42.iOS开发基础127-深入探讨KVO43.iOS开发基础126-深入探索设计模式44.iOS开发基础125-深入探索SDWebImage45.iOS开发基础124-RunLoop实现卡顿检测46.iOS开发基础123-自动释放池原理47.iOS开发基础122-RunLoop48.iOS开发基础121-APP启动优化49.iOS开发基础120-通知与线程50.iOS开发基础119-组件化51.iOS开发基础118-Runtime52.iOS开发基础117-Hybrid53.iOS开发基础116-性能监控54.iOS开发基础115-Socket55.iOS开发基础114-YYCache56.iOS开发基础113-Unity3D57.iOS开发基础112-GCD常见场景58.iOS开发基础111-RAC59.iOS开发基础110-Core Graphics应用场景60.iOS开发基础109-网络安全61.iOS开发基础108-常见的编程范式62.iOS开发基础107-iOS直播63.iOS开发基础148-ABM vs MDM64.iOS开发基础147-ABM集中管理Apple设备65.iOS开发基础146-深入解析WKWebView66.iOS开发基础145-Apple Search Ads67.iOS开发基础144-逐字打印效果68.iOS开发基础143-性能优化69.iOS开发基础142-广告归因70.iOS开发基础141-音频解码71.iOS开发基础140-音频编码72.iOS开发基础139-视频解码73.iOS开发基础149-由UUIDString引发的思考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,你可以在应用程序中有效地进行并发编程,提高程序的性能和响应能力。上述的生产者-消费者示例演示了基本的线程创建、同步和通信技巧,适合于处理多线程环境下的共享资源问题。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!