- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在开发一个 C 程序,它或多或少是一个统一的(解)多路复用器,用户可以在其中创建输入和输出之间的映射。虽然目的地只保留一次并且对所有源都可用,但一个源可以在不同的组中存在一次或多次(但不能在同一组中出现两次)
无论如何,这是我的背景。为了让群组变得有用,我实现了一个根据用户输入切换群组的功能。
当前事件组由指针“activeGroup”保存。
每个输出目的地都有一个线程等待输入并检查事件组的映射,因此使用“activeGroup”指针。
我今天的测试环境使用了 ca。 2kHz 输入,而最终用户输入可能更高(例如 1000kHz,考虑到非事件源也可以发送数据)。没有明显的问题。
我现在的问题:
我应该为“activeGroup”指针使用 RWLock 吗?原子地简单交换指针是一个问题吗?通常我不介意一个或一百个输入包在短短的几分之一秒内到达错误的目的地,但如果读取线程在绝对最错误的时刻读取,我是否会以某种方式出现段错误?
唯一写入指针的函数:
bool activate_group(char *groupName){
... (get correct group to activate)
if(newActive){
if(activeGroup)
activeGroup->isActive = false;
// the only writing line to activegroup
activeGroup = grp;
grp->isActive = true;
return true;
}
return false;
}
访问它的两个函数之一(非常相似)
void forward_sender(...){
if(activeGroup && (input = FINDCORRECTINPUTSOUCEIN(activeGroup->mappingList)){
snd_params par;
par.sockfd = sockfd;
par.msg = buffer;
par.len = len;
sendMultipleByInput(activeGroup->mappingList, sender, &par);
}
}
另一个函数直接发送,这个可能发送多次。
如果 activeGroup 在两者之间切换,sendMultipleByInput 将不会发送,因为它不会在现在新的事件映射列表中找到设备之间的映射。
如果当前实现可能发生这种情况,我是否可以通过简单地访问 activeGroup 指针一次并将值复制到本地指针来避免这种情况?
我猜,如果有的话,那会把这种可能性降到最低?
由于性能是我程序的关键因素,我喜欢尽可能多的同步方法,这些方法可能会减慢速度甚至导致死锁(不太可能在这里使用 rwlock 更喜欢 writer,但仍然如此)
感谢您的任何见解
最佳答案
到目前为止还没有人回答,所以希望我能提供帮助。
要扩展死锁注释,请考虑经典示例...
T1: A -> B
T2: B -> A
只需将 T2
的顺序切换为...即可避免死锁(T1
和 T2
都可以取得进展)
T2: A -> B
你绝对不应该为了避免死锁而避免锁。不过,使用 rwlock
的直觉是正确的,因此最好还是尽量减少关键部分的范围。
锁的性能不应该是一个问题。大多数锁实现将避免进入内核。如果延迟真的是一个问题,那么有很多好的自旋锁实现。
不使用显式同步几乎肯定会导致不正确的行为。在大多数架构(尤其是 x86)上,写入指向内存的指针通常是一个原子操作,但未定义跨内核/处理器的读写顺序。
例如,在您的代码中...
bool activate_group(char *groupName){
... (get correct group to activate)
if(newActive){
if(activeGroup)
activeGroup->isActive = false;
// the only writing line to activegroup
activeGroup = grp;
grp->isActive = true;
return true;
}
return false;
}
和...
void forward_sender(...){
if(activeGroup && (input = FINDCORRECTINPUTSOUCEIN(activeGroup->mappingList)){
snd_params par;
par.sockfd = sockfd;
par.msg = buffer;
par.len = len;
sendMultipleByInput(activeGroup->mappingList, sender, &par);
}
}
有许多不同的有效内存顺序。特别是,没有什么可以保护 mappingList
在 activeGroup
之前被更新。实际顺序几乎与程序顺序无关。更重要的是,编译器总是会避免内存读写。因此,这些值很可能会保留在寄存器中,甚至不会接触内存。
!!!危险区域!!!
如果无锁编程是绝对必要的 C11 添加了无锁 atomics .但是,除非您完全理解各种内存排序排列,否则您几乎肯定会得到意想不到的行为。
关于C 交换指针竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31842230/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!