美文网首页
线程安全之信号量

线程安全之信号量

作者: 二进制人类 | 来源:发表于2022-10-07 10:48 被阅读0次

相关API

初始化信号量

#include <semaphore.h>
/**
 * [sem_init 初始信号量]
 * @param  sem     [初始化信号量的指针]
 * @param  pshared [
 * pshared表示信号量访问可见性:
        0 表示的当前进程中的多个线程可见(推荐)
        非0 表示可以多个进程间可见;
 * ]
 * @param  value   [表示的信号量的初始值]
 * @return         [成功返回0,失败返回-1且修改errno的值]
 */
int sem_init(sem_t *sem, int pshared, unsigned int value);

销毁

#include <semaphore.h>
int sem_destroy(sem_t *sem);

p操作

#include <semaphore.h>
/*功能:P操作,阻塞模式实现,当信号量的值等于0进入阻塞态,直到信号量大于0唤醒并sem--;*/
int sem_wait(sem_t *sem);
/*功能:以非阻塞模式实现,当信号量的等于0直接返回错误信息,大于0sem--;*/
int sem_trywait(sem_t *sem);
/*功能:在设定的时间范围内阻塞,信号量大于0sem--或者超过时间直接返回,*/
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

v操作

#include <semaphore.h>
int sem_post(sem_t *sem);    //sem++;

互斥实现

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;/* 定义信号量 */
char buf[] = "0123456789";

/* 定义数组元素输出子线程执行函数 */
void *prt_arr(void *arg)
{
    while(1)
    {
        /* P操作 */
        sem_wait(&sem);
        printf("%s\n", buf);
        /* V操作 */
        sem_post(&sem);
        sleep(1);
    }
}

/* 定义数组元素倒序子线程执行函数 */
void *reverse_arr(void *arg)
{
    int i;
    char tmp;
    while(1)
    {
        /* P操作 */
        sem_wait(&sem);
        for (i = 0; i < 5; i++)
        {
            tmp = buf[i];
            buf[i] = buf[9 - i];
            buf[9 - i] = tmp;
        }
        /* V操作 */
        sem_post(&sem);
    }
}

int main()
{
    int ret;
    pthread_t prt_id;
    pthread_t reverse_id;
    /* 初始化信号量的值为1 */
    sem_init(&sem, 0, 1);
    ret = pthread_create(&prt_id, NULL, prt_arr, NULL);
    if (ret != 0)
    {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    ret = pthread_create(&reverse_id, NULL, reverse_arr, NULL);
    if (ret != 0)
    {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    while(1)
    {
        printf("main pthread\n");
        sleep(10);
    }
    /* 销毁信号量 */
    sem_destroy(&sem);
}

同步实现

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;/* 定义信号量 */
sem_t sem1;
char buf[] = "0123456789";

/* 定义数组元素输出子线程执行函数:消费者线程 */
void *prt_arr(void *arg)
{
    while(1)
    {
        /* P操作 */
        sem_wait(&sem);
        sleep(1);
        printf("%s\n", buf);
        sem_post(&sem1);
    }
}

/* 定义数组元素倒序子线程执行函数:生产者线程 */
void *reverse_arr(void *arg)
{
    int i;
    char tmp;
    while(1)
    {
        /* P操作sem1 */
        sem_wait(&sem1);
        for (i = 0; i < 5; i++)
        {
            tmp = buf[i];
            buf[i] = buf[9 - i];
            buf[9 - i] = tmp;
        }
        //sleep(1);
        /* V操作 */
        printf("------------------\n");
        sem_post(&sem);
    }
}

int main()
{
    int ret;
    pthread_t prt_id;
    pthread_t reverse_id;
    /* 初始化信号量的值为0 */
    sem_init(&sem, 0, 0);
    sem_init(&sem1, 0, 1);
    ret = pthread_create(&prt_id, NULL, prt_arr, NULL);
    if (ret != 0)
    {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    ret = pthread_create(&reverse_id, NULL, reverse_arr, NULL);
    if (ret != 0)
    {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    while(1)
    {
        printf("main pthread\n");
        sleep(10);
    }
    /* 销毁信号量 */
    sem_destroy(&sem);
    sem_destroy(&sem1);
}

相关文章

  • 线程安全之信号量

    相关API 初始化信号量 销毁 p操作 v操作 互斥实现 同步实现

  • iOS 实现一个栈 使用数组 (二)

    iOS 实现一个栈 这个栈是线程安全的 线程的安全使用GCD的信号量 dispatch_semaphore_t ...

  • iOS线程安全-dispatch_semaphore(信号量)的

    如何保证线程安全?我们可以使用信号量来控制线程的操作顺序。 定义: 1、信号量:就是一种可用来控制访问资源的数量的...

  • 2020-02-06 2.4 信号量 Samaphore

    本文是Java线程安全和并发编程知识总结的一部分。 2.4 信号量(对象Samaphore) 信号量是用来控制并发...

  • 系统编程-------线程编程----线程信号传递

    线程信号的传递 线程信号量 sem_inti;线程信号量初始化 参数: sem_t *sem,定义的信号量 in...

  • 多线程

    多线程解决资源安全问题,有以下方式: 信号量(lock Monitor Mutex AutoEventSet Ma...

  • java concurrency <信号量>

    java concurrency <信号量> 使用信号量的目的 线程信号量的目的是使线程能够彼此发送信号。 此外,...

  • 线程同步之使用信号量semaphore

    线程同步之使用信号量semaphore 基本概念 信号量:信号量就是一个整数,并且具有一个初始计数值。支持两个操作...

  • iOS 锁的使用

    参考 demo 参考的文章:iOS开发中的11种锁以及性能对比多线程-线程安全 结论: 自旋锁性能 > 信号量 >...

  • 7.信号量的使用2021-11-01

    信号量相当于裸机中的标志 信号量可以由不同的线程释放,互斥量必须由相同的线程释放。 信号量:实现线程间的通信,同步...

网友评论

      本文标题:线程安全之信号量

      本文链接:https://www.haomeiwen.com/subject/nayuartx.html