linux 函数 sem_init () 信号量、sem_destroy()

(1)



(2) 代码举例:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t semaphore;

void* thread_function(void* arg) 
{
    sem_wait(&semaphore); // 等待信号量
    printf("Thread %ld entered critical section.\n", (long)arg);
    sleep(1);             // 模拟临界区工作
    printf("Thread %ld leaving critical section.\n", (long)arg);
    sem_post(&semaphore); // 释放信号量
    return NULL;
}

int main() 
{
    pthread_t thread1, thread2;

    if (sem_init(&semaphore, 0, 1) != 0) {  // 初始化二进制信号量,初始值为1
        perror("sem_init");
        exit(EXIT_FAILURE);
    }

    pthread_create(&thread1, NULL, thread_function, (void*)1);   // 创建两个线程
    pthread_create(&thread2, NULL, thread_function, (void*)2);

    pthread_join(thread1, NULL);    pthread_join(thread2, NULL); // 等待线程完成
    
    sem_destroy(&semaphore);  // 销毁信号量

    return 0;
}

++ 在这个示例中,两个线程尝试进入临界区,但由于信号量的初始值为 1,因此一次只能有一个线程进入。当一个线程进入临界区后,它会等待一秒钟(模拟工作),然后离开临界区并释放信号量,允许另一个线程进入。

(3)

(4)

谢谢

相关推荐
Xの哲學1 小时前
Linux RCU (Read-Copy-Update) 机制深度分析
linux·网络·算法·架构·边缘计算
東雪蓮☆1 小时前
Linux 网络流量监控 Shell 脚本详解(支持邮件告警)
linux·运维·服务器
小跌—2 小时前
Linux:进程信号理解
linux·c++·算法
東雪蓮☆2 小时前
使用 Shell 脚本监控服务器 IOWait 并发送邮件告警
linux·运维·服务器
Lin_Aries_04212 小时前
在 CentOS 9 上安装 Docker 的完整指南
linux·docker·centos
丁满与彭彭3 小时前
嵌入式学习笔记--Linux系统编程阶段--DAY06进程间通信-消息队列
linux·笔记·学习
egoist20234 小时前
[linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘
linux·运维·开发语言·缓存·缓冲区
GOTXX5 小时前
Valgrind检测内存泄漏入门指南
linux·开发工具·内存泄漏·检测工具
夜月yeyue5 小时前
嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
linux·单片机·udp·嵌入式·uboot·bootloard
ZYMFZ5 小时前
Linux系统shell脚本(四)
linux·运维·服务器