当前位置: 首页 > article >正文

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。我们创建了两个线程,它们都会尝试进入一个临界区。由于我们使用了信号量,保证了同一时刻只有一个线程可以进入临界区。当一个线程进入并离开临界区后,它会释放信号量,这样另一个线程就可以进入临界区了。
这个例子展示了如何使用信号量来同步对共享资源的访问,防止竞态条件的发生。在实际应用中,信号量可以用于更复杂的同步场景,如生产者-消费者问题、读者-写者问题等。


http://www.kler.cn/a/524356.html

相关文章:

  • 力扣面试150 快乐数 循环链表找环 链表抽象 哈希
  • 基于Cipher的Java加密工具类
  • spring中解决循环依赖的方法
  • 面试经典150题——图
  • stack 和 queue容器的介绍和使用
  • 多模态论文笔记——ViViT
  • 信息学奥赛一本通 1342:【例4-1】最短路径问题
  • 本地项目上传到码云
  • 代码随想录算法训练营第三十八天-动态规划-完全背包-139.单词拆分
  • 【go语言】指针
  • 2025 = 1^3 + 2^3 + 3^3 + 4^3 + 5^3 + 6^3 + 7^3 + 8^3 + 9^3
  • mac安装dockerdesktop优化
  • ECMAScript--promise的使用
  • AutoDL 云服务器:普通 用户 miniconda 配置
  • 二叉树介绍
  • Java多线程与高并发专题——JMM
  • 实验作业管理系统的设计与实现
  • Leetcode刷题-不定长滑动窗口
  • Vue 组件开发:构建高效可复用的前端界面要素
  • Spark Streaming的背压机制的原理与实现代码及分析
  • 力扣面试150 快乐数 循环链表找环 链表抽象 哈希
  • Java中实现ECDSA算法介绍、应用场景和示例代码
  • 机器人介绍
  • 《HelloGitHub》第 106 期
  • 扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
  • 【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章