sem_init的概念和使用案例-简洁版
sem_init
是 POSIX 系统中用于初始化一个信号量的函数。在多线程编程中,信号量是一种常用于同步线程对共享资源的访问的机制。
概念
信号量是一个整数变量,可以用来控制对共享资源的访问。它通常用于实现线程同步或进程同步,以确保在某一时刻只有一个线程或进程可以访问特定的资源或执行特定的操作。
sem_init
函数的原型如下:
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem
:指向信号量结构的指针。pshared
:一个整数,如果为0,则信号量被进程内的线程共享;如果非0,则信号量可以在多个进程之间共享。value
:信号量初始值,通常设置为1(表示资源可用)或资源的最大可用数量。
函数成功时返回0,出错时返回-1。
使用案例
以下是一个简单的使用 sem_init
的例子,用于在两个线程之间同步:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t sem;
void* thread_func(void* arg) {
// 等待信号量
sem_wait(&sem);
printf("线程进入临界区\n");
// 模拟做一些工作
sleep(1);
printf("线程离开临界区\n");
// 释放信号量
sem_post(&sem);
return NULL;
}
int main() {
pthread_t tid1, tid2;
// 初始化信号量,初始值为1
sem_init(&sem, 0, 1);
// 创建两个线程
pthread_create(&tid1, NULL, thread_func, NULL);
pthread_create(&tid2, NULL, thread_func, NULL);
// 等待线程结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 销毁信号量
sem_destroy(&sem);
return 0;
}
在这个例子中,我们初始化了一个信号量 sem
,初始值为1。我们创建了两个线程,它们都会尝试进入一个临界区。由于我们使用了信号量,保证了同一时刻只有一个线程可以进入临界区。当一个线程进入并离开临界区后,它会释放信号量,这样另一个线程就可以进入临界区了。
这个例子展示了如何使用信号量来同步对共享资源的访问,防止竞态条件的发生。在实际应用中,信号量可以用于更复杂的同步场景,如生产者-消费者问题、读者-写者问题等。