首页 > 系统相关 >Linux多线程14-信号量

Linux多线程14-信号量

时间:2023-06-26 09:12:19浏览次数:41  
标签:14 int 信号量 mutex pthread sem 多线程 struct

信号量的类型 sem_t

int sem_init(sem_t *sem, int pshared, unsigned int value);
    初始化信号量
    参数:
        - sem: 信号量变量地址
        - pshared: 0 用在线程间, 非0 用在进程间
        - value: 信号量中的值
        
int sem_destroy(sem_t *sem);
    释放资源

int sem_wait(sem_t *sem);
    对信号量加锁,调用一次对信号量的值-1, 如果值为0,就阻塞
int sem_trywait(sem_t *sem);
    尝试,如果是0资源不可用,阻塞
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
    阻塞多长时间
int sem_post(sem_t *sem);
    对信号量解锁,调用一次对信号量的值+1
int sem_getvalue(sem_t *sem, int *sval);
    获取信号量值

代码示例

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

//创建互斥量
pthread_mutex_t mutex;
//创建两个信号量
sem_t psem;
sem_t csem;

struct Node{
    int num;
    struct Node* next;
};

//头节点
struct Node* head = NULL;

void* producer(void* arg){
    //往容器中添加内容
    //不断的创建新节点, 添加到链表中
    while(1){
        //生产-1 ,最终生产8个
        sem_wait(&psem);
        pthread_mutex_lock(&mutex);
        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode -> next = head;
        head = newNode;
        newNode -> num = rand()%1000;
        printf("add node, num: %d, tid: %ld\n", newNode->num, pthread_self());
        pthread_mutex_unlock(&mutex);
        //消费+1,最终消费8个
        sem_post(&csem);
        usleep(100);
    }
    return NULL;
}
void* customer(void* arg){
    //从容器中消费内容
    while(1){
        //消费-1,告诉生产者又消费了1个
        sem_wait(&csem);
        pthread_mutex_lock(&mutex);
        //保存头节点指针
        struct Node* tmp = head;
        head = head->next;
        printf("delete node, num: %d, tid: %ld\n", tmp->num, pthread_self());
        free(tmp);
        pthread_mutex_unlock(&mutex);
        //生产+1, 告诉生产者多1个空位可以生产
        sem_post(&psem);
        usleep(100);
    }
    return NULL;
}

int main(){
    pthread_mutex_init(&mutex, NULL);
    sem_init(&psem, 0, 8);
    sem_init(&csem, 0, 0);


    //5个生产者线程, 5个消费者线程
    pthread_t ptid[5], ctid[5];

    int i;
    for(i=0; i<5; i++){
        pthread_create(&ptid[i], NULL, producer, NULL);
        pthread_create(&ctid[i], NULL, customer, NULL);
    }

    for(i=0; i<5; i++){
        pthread_detach(ptid[i]);
        pthread_detach(ctid[i]);
    }

    while(1){
        sleep(10);
    }

    pthread_mutex_destroy(&mutex);

    pthread_exit(NULL);

    return 0;
}

标签:14,int,信号量,mutex,pthread,sem,多线程,struct
From: https://www.cnblogs.com/anqwjoe/p/17504459.html

相关文章

  • Linux多线程13-条件变量
    上节代码存在的问题:生产者已经没有数据了,消费者还在while循环判断是否有数据,浪费资源没有数据了应该通知生产者生产,生产好了通知消费者消费这就需要条件变量pthread_cond_tintpthread_cond_init(pthread_cond_t*restrictcond,constpthread_con......
  • Linux多线程01-线程概述
    线程概述与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的UNIX进程只是多线程程序......
  • Linux多线程02-创建线程
    pthread_create描述:pthread_create()函数在调用进程中创建一个新的线程。新线程通过调用start_routine()开始执行,arg作为start_routine()的唯一参数传递。新线程以以下方式之一终止:调用pthread_exit(3),指定可供调用同一进程中pthread_join(3)的其他线程使用的退......
  • Linux多线程04-连接已终止的线程
    pthread_join描述:pthread_join()函数等待由thread指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的......
  • Linux多线程03-终止线程
    pthread_exit和pthread_self和pthread_equal描述:pthread_exitpthread_exit()函数终止调用该函数的线程,并通过retval返回一个值,如果该线程是可连接的,则在同一进程中调用pthread_join(3)的另一个线程可以获取该值。任何由pthread_cleanup_push(3)建立但尚未弹出的清理处......
  • P2305 [NOI2014] 购票
    P2305[NOI2014]购票题意今年夏天,NOI在SZ市迎来了她三十周岁的生日。来自全国\(n\)个城市的OIer们都会从各地出发,到SZ市参加这次盛会。全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的\(n\)个城市用\(1\simn\)......
  • Linux多线程07-线程属性
    线程属性类型:pthread_attr_t描述:pthread_attr_setdetachstate()函数将由attr引用的线程属性对象的分离状态属性设置为detachstate中指定的值。分离状态属性确定使用线程属性对象attr创建的线程将在可连接状态还是分离状态下创建。可以在detachstate中指定以下值:P......
  • Linux多线程06-线程取消
    pthread_cancel描述:pthread_cancel()函数向线程thread发送一个取消请求。目标线程对取消请求的响应取决于该线程控制的两个属性:其取消状态和类型。一个线程的取消状态由pthread_setcancelstate(3)确定,可以启用(对于新线程而言是默认的)或禁用。如果一个线程已禁用取消,则取消请......
  • Linux多线程05-线程的分离
    pthread_detach描述:pthread_detach()函数将由thread标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与已终止的线程加入。尝试分离一个已经分离的线程会导致未指定的行为。#include<pthread.h>intpthread_detach(pthread_tt......
  • Linux多线程08-线程同步
    一个多线程售票示例://三个窗口,共100张票#include<stdio.h>#include<pthread.h>#include<unistd.h>inttickets=100;//所有线程都共享这100张票void*sellticket(void*arg){//卖票while(tickets>0){usleep(6000);//间隔6000微秒p......