首页 > 其他分享 >20201317-Thread同步测试

20201317-Thread同步测试

时间:2022-11-11 14:23:03浏览次数:61  
标签:同步 Thread blank number 线程 pthread sem NULL 20201317

Thread同步测试

代码

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

#define NUM 5
int queue[NUM];
sem_t blank_number, product_number;
//信号量的数据类型为结构sem_t,本质上是长整型的数

void *producer ( void * arg )
{
	static int p = 0;
	
	for ( ;; ) {
		sem_wait( &blank_number );
        //sem_wait是一个函数,也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。
		queue[p] = rand() % 1000;
		printf("Product %d \n", queue[p]);
		p = (p+1) % NUM;
		sleep ( rand() % 5);
        //执行挂起一段时间
		sem_post( &product_number );
        //sem_post是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同时对同一个文件进行读和写操作的两个程序就有可能会引起冲突。
	}
}
void *consumer ( void * arg )
{

	static int c = 0;
	for( ;; ) {
		sem_wait( &product_number );
		printf("Consume %d\n", queue[c]);
		c = (c+1) % NUM;
		sleep( rand() % 5 );
		sem_post( &blank_number );
	}
}

int main(int argc, char *argv[] )
{
	pthread_t pid, cid;
    //声明线程ID
	sem_init( &blank_number, 0, NUM );
    //初始化信号量
	sem_init( &product_number, 0, 0);
    //初始化信号量
	pthread_create( &pid, NULL, producer, NULL);
    //创建线程
	pthread_create( &cid, NULL, consumer, NULL);
    //创建线程
	pthread_join( pid, NULL );
	pthread_join( cid, NULL );
    //获取某个线程执行结束后返回的数据,阻塞调用它的线程,直至目标线程执行结束。
	sem_destroy( &blank_number );
	sem_destroy( &product_number );
	//销毁sem指向的匿名信号量
    return 0;
}

运行截图

image-20221111111636122

修改代码,把同步资源个数减少为3个,把使用资源的线程增加到 (你的学号%3 + 4)个,编译代码,提交修改后的代码和运行结果截图。

线程数:20201317%3+4=5,即消费者线程增加到个数为5,且需要互斥地去访问产品(最多为三个),1一个生产者线程,5个消费者线程。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#include <unistd.h>
#define NUM 3
int queue[NUM];
sem_t blank_number, product_number,mutex;
 
int c = 0;
 
void *producer ( void * arg )//生产者
{
    static int p = 0;
 
    for ( ;; ) {
        sem_wait( &blank_number );//空格子锁
        queue[p] = rand() % 1000;
        printf("Product %d \n", queue[p]);
        p = (p+1) % NUM;
        sleep ( rand() % 5);
        sem_post( &product_number );
    }
}
void *consumer ( void * arg )//消费者
{
 
    for( ;; ) {
        sem_wait(&mutex);
        sem_wait( &product_number );
        printf("Consume %d\n", queue[c]);
        c = (c+1) % NUM;
        sleep( rand() % 5 );
        sem_post( &blank_number );
        sem_post( &mutex);
    }
}
 
int main(int argc, char *argv[] )
{
    pthread_t pid, cid,cid1,cid2,cid3,cid4;
     
    sem_init( &blank_number, 0, NUM );
    sem_init( &product_number, 0, 0);
    sem_init( &mutex, 1, 1);
    pthread_create( &pid, NULL, producer, NULL);
    pthread_create( &cid, NULL, consumer, NULL);
    pthread_create( &cid1, NULL, consumer, NULL);
    pthread_create( &cid2, NULL, consumer, NULL);
    pthread_create( &cid3, NULL, consumer, NULL);
    pthread_create( &cid4, NULL, consumer, NULL);
     
    pthread_join( pid, NULL );
    pthread_join( cid, NULL );
    pthread_join( cid1, NULL );
    pthread_join( cid2, NULL );
    pthread_join( cid3, NULL );
    pthread_join( cid4, NULL );
 
    sem_destroy( &blank_number );
    sem_destroy( &product_number );
    return 0;
}

image-20221111140742464

标签:同步,Thread,blank,number,线程,pthread,sem,NULL,20201317
From: https://www.cnblogs.com/lyxhhz/p/16880324.html

相关文章

  • 【Java】随机数原理 Random ThreadLocalRandom
    大致生成原理:随机数由seed经过一定的转换生成。需要提供初始seed。每一次生成随机数时,先由老seed生成新seed,再根据新seed生成新的随机数。由于算法是固定的,所以如果初始seed......
  • 线程同步和死锁
    线程同步线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。synchronized锁为了保证多线......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • centos7自建yum仓库同步阿里云yum源
    背景:内网环境服务器不能直接安装工具或服务,可以用一台外网服务器同步阿里云的yum仓库,作为本地仓库搭建本地yum仓库编辑yum配置文件,开启缓存使用功能,设置缓存路径cp/e......
  • django 根据数据库表结构逆向操作model,同步表结构到models.py
    根据数据库表结构的修改,同步models.py,比如我们修改了数据库中某张表的字段类型,或者给这张表又加了好几个字段,这时我们在models.py中一个字段一个字段的加会有点麻烦,并且可......
  • ThreadLocal
    ThreadLocal是什么?ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现......
  • 27-jmeter-同步定时器
    前言LoadRunner中可以设置一个集合点,设置多个虚拟用户等待到一个时间点,到齐后一起发请求达到并发的目的。集合点概念:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬......
  • 如何实现数据文件自动化的实时同步?
    企业在日常业务中,比如总分支机构之间、数据中心之间、不同节点之间、跨国业务之间等,都需要将文件及时的传输,以供协同使用。所以,很多企业会选择一些同步工具或软件。谈到......
  • 20201317 读者-写者(多线程)问题的思考与研究
    操作系统中"读者-写者"问题1.OS“读者-写者”问题,理解问题的本质,提交你理解或查找到的文本资料1、允许多个读者可以同时对文件执行读操作。2、只允许一个写者往文件中......
  • 20201317-Linux-Thread 互斥测试
    #include<stdio.h>#include<stdlib.h>#include<pthread.h>//linux线程库#include<ctype.h>//测试和映射字符的库structarg_set{ char*fname; int......