一、线程分离属性

  • 默认情况下,线程退出后栈空间不会自动释放,需手动 pthread_join
  • 设置分离属性后,线程退出时系统自动回收资源
int pthread_detach(pthread_t thread);
  • 功能:将线程设为分离状态。
  • 返回值:0 成功,非 0 失败。

二、线程同步机制

1. 互斥锁(Mutex)

用途:保护临界资源,实现排他性访问

编程步骤:
  1. 定义互斥锁
    pthread_mutex_t mutex;
  2. 初始化
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
    // attr 通常为 NULL
  3. 加锁
    int pthread_mutex_lock(pthread_mutex_t *mutex); // 阻塞直到获得锁
  4. 解锁
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
  5. 销毁
    int pthread_mutex_destroy(pthread_mutex_t *mutex);

⚠️ 注意:加锁/解锁必须成对出现,否则可能导致死锁。


2. 信号量(Semaphore)——用于同步(有顺序的访问)

头文件#include <semaphore.h>

编程步骤:
  1. 定义c
    sem_t sem;
  1. P 操作(申请资源)c
    int sem_wait(sem_t *sem); // 若资源为 0,则阻塞
  2. V 操作(释放资源)c
    int sem_post(sem_t *sem); // 资源 +1,不阻塞
  3. 销毁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)

产生条件(四个必要条件):

  1. 互斥条件:资源一次只能被一个线程使用。
  2. 请求与保持:线程持有资源的同时请求新资源。
  3. 不可剥夺:已分配资源不能被强制收回。
  4. 循环等待:存在线程间的循环资源依赖链。

预防方法:

  • 按固定顺序加锁。
  • 使用超时机制(如 pthread_mutex_timedlock)。
  • 避免嵌套锁。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐