Linux-线程-02
·
一、线程分离属性
- 默认情况下,线程退出后栈空间不会自动释放,需手动
pthread_join。 - 设置分离属性后,线程退出时系统自动回收资源。
int pthread_detach(pthread_t thread);
- 功能:将线程设为分离状态。
- 返回值:0 成功,非 0 失败。
二、线程同步机制
1. 互斥锁(Mutex)
用途:保护临界资源,实现排他性访问。
编程步骤:
- 定义互斥锁
pthread_mutex_t mutex; - 初始化
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); // attr 通常为 NULL - 加锁
int pthread_mutex_lock(pthread_mutex_t *mutex); // 阻塞直到获得锁 - 解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex); - 销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
⚠️ 注意:加锁/解锁必须成对出现,否则可能导致死锁。
2. 信号量(Semaphore)——用于同步(有顺序的访问)
头文件:#include <semaphore.h>
编程步骤:
- 定义c
sem_t sem;
- P 操作(申请资源)c
int sem_wait(sem_t *sem); // 若资源为 0,则阻塞 - V 操作(释放资源)c
int sem_post(sem_t *sem); // 资源 +1,不阻塞 - 销毁c
int sem_destroy(sem_t *sem);
应用类型:
- 二值信号量(value = 1):类似互斥锁,但可跨线程控制顺序。
- 计数信号量(value > 1):管理多个同类资源(如最多 3 个窗口同时服务)。
示例:限制最多 3 个线程同时执行
sem_t sem_WIN;
void* th(void* arg)
{
sem_wait(&sem_WIN); // 申请资源
printf("get win...\n");
sleep(rand() % 5 + 1);
printf("release win...\n");
sem_post(&sem_WIN); // 释放资源
return NULL;
}
int main()
{
pthread_t tid[10];
srand(time(NULL));
sem_init(&sem_WIN, 0, 3); // 初始资源数 = 3
for (int i = 0; i < 10; i++)
{
pthread_create(&tid[i], NULL, th, NULL);
}
for (int i = 0; i < 10; i++)
{
pthread_join(tid[i], NULL);
}
sem_destroy(&sem_WIN);
return 0;
}
三、死锁(Deadlock)
产生条件(四个必要条件):
- 互斥条件:资源一次只能被一个线程使用。
- 请求与保持:线程持有资源的同时请求新资源。
- 不可剥夺:已分配资源不能被强制收回。
- 循环等待:存在线程间的循环资源依赖链。
预防方法:
- 按固定顺序加锁。
- 使用超时机制(如
pthread_mutex_timedlock)。 - 避免嵌套锁。
更多推荐

所有评论(0)