首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 信号量 互斥锁

Linux 信号量与互斥锁基础概念

信号量(Semaphore)

信号量是一种用于控制多个进程对共享资源访问的同步机制。它本质上是一个计数器,用于记录对资源的访问次数。信号量有两种基本操作:

  • P操作(等待操作):进程尝试获取信号量,如果信号量值大于0,则进程可以继续执行并减少信号量值;如果信号量值为0,则进程被阻塞,直到信号量值大于0。
  • V操作(释放操作):进程释放信号量,增加信号量的值,并唤醒一个等待的进程。

互斥锁(Mutex)

互斥锁是一种特殊的二进制信号量,其值只能为0或1,用于实现资源的互斥访问。互斥锁的操作与信号量类似:

  • 加锁(Lock):进程尝试获取互斥锁,如果锁未被占用,则进程可以继续执行并锁定资源;如果锁已被占用,则进程被阻塞。
  • 解锁(Unlock):进程释放互斥锁,解锁资源,并允许其他进程获取锁。

优势与应用场景

信号量的优势与应用场景

  • 优势:信号量可以控制多个进程对一组资源的访问,适用于资源数量大于1的情况。
  • 应用场景:多进程编程中,当多个进程需要访问同一组资源时,可以使用信号量来协调访问。

互斥锁的优势与应用场景

  • 优势:互斥锁简单且高效,适用于保护临界区,确保同一时间只有一个进程访问共享资源。
  • 应用场景:多线程或多进程编程中,当需要对某个资源进行独占访问时,可以使用互斥锁来防止竞态条件。

示例代码

信号量示例(使用POSIX信号量)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>

sem_t sem;

void* thread_func(void* arg) {
    sem_wait(&sem); // P操作
    printf("Thread is working\n");
    sleep(1);
    sem_post(&sem); // V操作
    return NULL;
}

int main() {
    sem_init(&sem, 0, 3); // 初始化信号量,初始值为3
    pthread_t threads[5];

    for (int i = 0; i < 5; ++i) {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }

    for (int i = 0; i < 5; ++i) {
        pthread_join(threads[i], NULL);
    }

    sem_destroy(&sem);
    return 0;
}

互斥锁示例(使用pthread库)

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex;

void* thread_func(void* arg) {
    pthread_mutex_lock(&mutex); // 加锁
    printf("Thread is working\n");
    sleep(1);
    pthread_mutex_unlock(&mutex); // 解锁
    return NULL;
}

int main() {
    pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
    pthread_t threads[5];

    for (int i = 0; i < 5; ++i) {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }

    for (int i = 0; i < 5; ++i) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&mutex);
    return 0;
}

常见问题及解决方法

信号量常见问题

  1. 死锁:多个进程互相等待对方释放资源。
    • 解决方法:确保每个进程在获取多个信号量时遵循相同的顺序,或者使用超时机制。
  • 资源泄漏:进程忘记释放信号量。
    • 解决方法:在进程退出前确保调用sem_post释放信号量,或者使用RAII技术管理信号量的生命周期。

互斥锁常见问题

  1. 死锁:多个线程互相等待对方释放锁。
    • 解决方法:确保每个线程在获取多个锁时遵循相同的顺序,或者使用超时机制。
  • 优先级反转:低优先级线程持有高优先级线程所需的锁。
    • 解决方法:使用优先级继承或优先级天花板协议来解决优先级反转问题。

通过合理设计和使用信号量及互斥锁,可以有效避免并发编程中的常见问题,确保程序的正确性和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

24分33秒

269_尚硅谷_Go核心编程_全局互斥锁解决资源竞争.avi

7分16秒

165、缓存-分布式锁-Redisson-信号量测试

25分13秒

49.Redisson之RSemaphore信号量

9分14秒

79.Curator之InterProcessSemaphoreV2信号量

领券