在Linux中,信号量(Semaphore)是一种用于控制多个进程或线程对共享资源的访问的同步机制。信号量本质上是一个计数器,用于记录共享资源的数量或状态,从而实现对共享资源的互斥访问或同步控制。
以下是一个使用POSIX信号量实现互斥锁的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
sem_t mutex;
void* thread_func(void* arg) {
int id = *(int*)arg;
sem_wait(&mutex); // 获取信号量
printf("Thread %d has entered the critical section.
", id);
sleep(1); // 模拟一些工作
printf("Thread %d is leaving the critical section.
", id);
sem_post(&mutex); // 释放信号量
return NULL;
}
int main() {
pthread_t threads[5];
int ids[5] = {1, 2, 3, 4, 5};
sem_init(&mutex, 0, 1); // 初始化信号量为1
for (int i = 0; i < 5; ++i) {
pthread_create(&threads[i], NULL, thread_func, &ids[i]);
}
for (int i = 0; i < 5; ++i) {
pthread_join(threads[i], NULL);
}
sem_destroy(&mutex); // 销毁信号量
return 0;
}
sem_wait
调用都有对应的sem_post
调用,并且避免嵌套锁。sem_post
释放信号量,可能导致其他进程或线程永久阻塞。解决方法是使用RAII(Resource Acquisition Is Initialization)模式管理信号量,确保在异常或错误情况下也能正确释放信号量。通过合理使用信号量,可以有效地解决多进程或多线程环境中的同步问题,提高程序的稳定性和可靠性。
腾讯云数据库TDSQL训练营
腾讯云数据库TDSQL(PostgreSQL版)训练营
云+社区沙龙online [国产数据库]
云+社区沙龙online [国产数据库]
Elastic Meetup
腾讯云存储知识小课堂
2022OpenCloudOS社区开放日
云+社区沙龙online第6期[开源之道]
云原生正发声
腾讯云数据库TDSQL训练营
腾讯云数据库TDSQL训练营
领取专属 10元无门槛券
手把手带您无忧上云