2020-12-19

Revit实战:从零到一,手把手教你用族(Family)搭建一个完整的水闸BIM模型 本文详细介绍了如何使用Revit的族(Family)功能从零开始构建一个完整的水闸BIM模型。通过参数化族设计,实现闸门开度调整自动关联流量计算等智能化功能,提升水利工程BIM模型的工程价值和应用效率。文章涵盖族库规划、核心构件创建、高级技巧及BIM数据深度应用,为水利工程数字化提供实用指南。 阅读详情

Window下C++的线程同步demo

今天考试自我感觉十分不理想,浏览了一下课程中就写的线程同步demo,提会了曾经的思维方式,发现我将约束(同步)抽象较高层次了,条件(顺序)约束需要往下分解才能直接用于实践指导!比如说:

  • 资源个数——初始值为n。
  • 开始活动的信号——初始值0/1。
  • (以后来补充)

对于资源个数,其实可以通过以不同角度去定义资源来广义地扩大适用范围。

以后的补充

2020-12-31

大多数平台提供的同步机制中等待队列(阻塞队列)的次序默认是FIFO,且不能直接应用在需要通知并立即等待(即先V操作,再立刻P操作陷入等待事件)的可区分线程之间!
我的解决方案是自己实现信号量,下面是大致点与一些分析。

  • 利用互斥锁实现可区分等待队列,且维护通知对象队列。
  • 通知并等待通知对象处理完的线程按以下步骤执行:
    ①将自己插入等待队列。
    ②查看通知对象队列是否不为空,若不为空,则唤醒其进行处理。
    ③等待唯一性消息(由通知对象发出)。

该方案存在两个关键点——唯一性消息和如何等待!消息唯一是为了支持线程可区分,这一点至关重要!而怎样的等待可以避免忙等等损坏性能还能做到一定程度上的实时,是如何等待的关键点!

下面是我目前想到的唯一性消息的几种实例,但都存在一些瑕疵。

  • 等待对象的自身状态。由等待对象在第一步时,将自身状态更新为“等待”,通知对象对其进行修改作为唯一性信号。
  • 线程信息。可以将环境自带的线程操作看作唯一性消息,例如悬挂/取消悬挂、终止信号(C#的abort,可以通过try捕捉异常继续执行)等等。

这两个都存在问题。第一个,它的通用性很差,目前想到的弥补方式是该信号量实现要求等待对象实现状态检查、状态修改接口。第二个,就是一个经典的线程同步问题,存在等待对象的线程还没有悬挂自身,或者没进入try内,通知对象已经发出取消悬挂之类的信息了!弥补方式是,等待队列的互斥锁在插入自身之后不立刻释放,而是进入等待信号区域后释放;但这个只能用于终止信号的try捕捉类型的消息,类似悬挂这种一进入等待区域后就不能执行任何其他代码的方式就无法使用该弥补方式!

另一方面,如何等待更是一个性能方面的关键问题,主要目标是避免循环忙等现象(死等只有通知对象不存在的情况下出现,故不做考虑)。很遗憾,我目前只想到间断休眠等待而已!希望有大佬指点迷津!

这方面感觉是有些无解,忙等与实时彼此矛盾,至少我所了解OS提供的API无法解决这个矛盾!(OS层理论上可以清除这种矛盾)

第一次编辑代码展示

附上代码。一些简单的window API就不解释了。

#include <stdio.h>
#include <windows.h>
/*
	功能:爸爸妈妈儿子女儿线程模拟
	爸爸给苹果,女儿吃		(条件约束)
	妈妈给橘子,儿子吃		(条件约束——儿子开始活动的信号)
	盘子只能放下一个,		(条件约束——盘子容量资源)
	且不能同时放。			 (互斥约束)
*/

//定义互斥锁和
HANDLE dishAccess;
HANDLE orangeNumber,AppleNumber,dishCapcity;		//信号量,条件约束


//线程函数 dady
DWORD WINAPI dady(LPVOID lpParam) {
	int Orage = (int)lpParam;
	DWORD dwWrite;
	for (int i = 0; i < Orage; i++) {
		//进入临界区
		//真正实践项目,应该检测返回值是否等待超时,infinite也是有限的,不检测在极端情况可能会出错!
		WaitForSingleObject(dishAccess,INFINITE);
		WaitForSingleObject(dishCapcity, INFINITE);
		ReleaseSemaphore(orangeNumber,1,NULL);
		printf("father puts one orange into dish\n", Orage);
		//退出临界区
		ReleaseMutex(dishAccess);
	}
	
	return 0;
}


//线程函数 mom
DWORD WINAPI mom(LPVOID lpParam) {
	int apple = (int)lpParam;
	DWORD dwWrite;
	for (int i = 0; i < apple; i++) {
		//进入临界区
		WaitForSingleObject(dishAccess, INFINITE);
		WaitForSingleObject(dishCapcity, INFINITE);
		ReleaseSemaphore(AppleNumber, 1, NULL);
		printf("monther puts one apple into dish\n", apple);
		//退出临界区
		ReleaseMutex(dishAccess);
	}

	return 0;
}


//线程函数 son
DWORD WINAPI son(LPVOID lpParam) {
	int Capaticy = (int)lpParam;		//儿子能吃多少
	DWORD dwWrite;
	for (int i = 0; i < Capaticy; i++) {
		//等待橘子
		WaitForSingleObject(orangeNumber, INFINITE);
		printf("son eat the %d orange!\n",i+1);
		ReleaseSemaphore(dishCapcity, 1, NULL);
	}

	return 0;
}


//线程函数 daughter
DWORD WINAPI daughter(LPVOID lpParam) {
	int capacity = (int)lpParam;
	DWORD dwWrite;
	for (int i = 0; i < capacity; i++) {
		//等待苹果
		WaitForSingleObject(AppleNumber, INFINITE);
		printf("daughter eat the %d apple!\n", i+1);
		ReleaseSemaphore(dishCapcity, 1, NULL);
	}

	return 0;
}

int main() {
	DWORD ThreadID;
	HANDLE hThread[4];

	DWORD (*threadFunction[])(LPVOID lpParam) = {dady,mom,son,daughter };
	//初始化信号量
	AppleNumber = CreateSemaphore(NULL, 0, 5, NULL);
	orangeNumber = CreateSemaphore(NULL, 0, 5, NULL);
	dishAccess = CreateMutex(NULL, FALSE, NULL);
	dishCapcity = CreateSemaphore(NULL, 1, 1, NULL);

	for (int i = 0; i < 4; i++) {
		//创建线程,并调用Thread写文件
		hThread[i] = CreateThread(NULL, 0, threadFunction[i], (LPVOID)(5), 0, &ThreadID);
		ThreadID++;
		printf("Thread #%d has been created successfully.\n", i + 1);
	}
	//等待所有进程结束
	WaitForMultipleObjects(4, hThread, TRUE, INFINITE);
	//删除临界区
	


	return 0;
}
每日算法讲解(十):使用BP神经网络进行回归任务 BP神经网络是由输入层、隐藏层和输出层组成的多层前馈神经网络,通过反向传播算法(Backpropagation)来调整网络权重和偏置,以最小化预测误差。前向传播:将输入数据通过网络,计算每层的激活值和输出。计算误差:根据预测值和真实值之间的差异计算损失函数值。反向传播:从输出层开始,逐层向后计算梯度,并更新每层的权重和偏置。重复迭代:通过多次迭代,逐步减小预测误差,优化模型参数。接下来,我们定义一个包含一个输入层、两个隐藏层和一个输出层的BP神经网络模型。# 定义模型# 编译模型。 阅读详情

相关推荐

QT+SOEM主站协议库实战指南—从编译到嵌入式应用

本文提供了一份QT与SOEM开源EtherCAT主站协议库的集成实战指南。详细介绍了在Windows和Linux平台下编译SOEM库的步骤,并讲解了如何将其无缝集成到QT项目中,构建具备实时监控与控制功能的工业上位机应用。内容涵盖从环境搭建、核心协议开发到嵌入式部署与优化的全流程,为开发高性价比、自主可控的工业控制解决方案提供完整路径。

u6v7w8x的博客 437

js 中日期 转换成时间戳 例如2020-12-19 转换为时间戳

日期转时间戳 Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2020-12-19"); System.out.println(date.getTime()/1000); 也可以 long date = new SimpleDateFormat("yyyy-MM-dd").parse(starttime).getTime()/1000; System.out.println(date);

技术老鸟 5968

xsens IMU配置

1.安装驱动 sudo apt-get update sudo apt-get install ros-kinetic-xsens-driver 2.配置IMU 设置输出四元数,加速度、角速度、地磁 cd /opt/ros/kinetic/lib/xsens_driver python mtdevice.py --configure "oq,aa,wr,mf" 3.启动IMU roslaunch xsens_driver xsens_driver.launch 转(https://www.cnblo

qq_41585680的博客 2324

有意思的一天 2020.12.19日记

今天好像也说平常又不平常的一天。 只有周六早上的工程矩阵课能让我准时早起了,早上起来上了数学课后,点了一顿好的外卖准备迎接泽塔奥特曼的大结局。 大结局果然没让我失望,有很多精彩的镜头,同时也更加期待明年的新番,听说是新的故事模式。希望可以回到平成时候的节奏,不再借力量,可以做成年度番。 今天的数学作业是真的多啊,写(抄)了好久还没有写完,转眼间下午三点就到了,有期待的足协杯决赛。全华班的江苏队竟然走到了决赛,虽然赛前也都不太看好江苏的阵容,但是都走到决赛了,换谁都会幻想一下双冠吧。但是决赛毕竟看的是实力,我

每天都来写日记!的博客 204

Windows 11安装realtek audio control

Windows 11安装realtek audio control,解决无法链接RPC问题

m0_46144825的博客 8万+

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

西安邮电大学2020.12.19ACM新生赛题解(部分)

西安邮电大学2020.12.19ACM新生赛题解(部分) A题:永远的王聪明王 难易程度:简单 描述 一天,聪明王在家中写作业,一共有n门课的作业,现在他知道自己写完每门作业的时间。他的妈妈可能随时会回来,他想在他的妈妈回来时尽可能的写完多的科目(显得自己很努力),他该如何安排写作业的顺序呢?聪明的你帮他安排一下吧。 输入 第一行输入一个数n,接下来n行,每行有两个输入,第一个是科目名称,第二个是一个整数x,表示完成这门课所需要时间。1≤n≤10 6,1≤x≤10 6 ,输入保证科目名称不会超过100个字

m0_49767338的博客 877

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364
上一篇: 2020-12-07
InsectOfJava
博客等级 码龄7年 0粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值