在Linux中,互斥体(Mutex)和信号量(Semaphore)都是用于进程或线程间同步的机制,以防止多个进程或线程同时访问共享资源,从而引发数据不一致的问题。
互斥体(Mutex)
基础概念:互斥体是一种同步机制,用于保护共享资源,以防止多个线程同时访问。当一个线程获取互斥体时,其他试图获取该互斥体的线程将被阻塞,直到拥有互斥体的线程释放它。
优势:
类型:主要是二进制互斥体(Binary Mutex),其状态只有两种:锁定和未锁定。
应用场景:适用于保护临界区,防止多个线程同时访问和修改共享数据。
信号量(Semaphore)
基础概念:信号量是一个计数器,用于控制多个进程或线程对共享资源的访问。信号量的值表示可用资源的数量。当一个进程或线程请求信号量时,信号量值减一;当释放信号量时,信号量值加一。
优势:
类型:
应用场景:
遇到的问题及解决方法
示例代码(使用POSIX线程库和信号量):
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define NUM_THREADS 5
sem_t sem; // 定义一个信号量
void* thread_func(void* arg) {
int id = *(int*)arg;
// 请求信号量
sem_wait(&sem);
printf("Thread %d is working
", id);
// 模拟工作
sleep(1);
printf("Thread %d is done
", id);
// 释放信号量
sem_post(&sem);
return NULL;
}
int main() {
pthread_t threads[NUM_THREADS];
int ids[NUM_THREADS];
// 初始化信号量,初始值为1(类似于互斥体)
sem_init(&sem, 0, 1);
// 创建线程
for (int i = 0; i < NUM_THREADS; i++) {
ids[i] = i + 1;
pthread_create(&threads[i], NULL, thread_func, &ids[i]);
}
// 等待线程结束
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
// 销毁信号量
sem_destroy(&sem);
return 0;
}
注意:上述示例代码使用信号量来模拟互斥体的行为,但实际上信号量和互斥体在使用和目的上有所不同。在实际应用中,应根据具体需求选择合适的同步机制。
领取专属 10元无门槛券
手把手带您无忧上云