- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要一种环形缓冲区(或一些更合适的数据结构,以防万一)和一种在以下情况下处理环形缓冲区的算法/模式。
1 连续生成实时数据的写入器必须始终能够写入第一个空闲“槽”(一个不在读取过程中的槽),或者等到一个槽空闲用于写入.每当编写器完成将数据写入一个槽时,它就可以为读者“提交”该槽。
在给定时间,可能有N个并发读者。在发出读取请求时,每个读取器都应该始终从环形缓冲区中最后提交的插槽中获取最新写入的数据,但不得多次读取相同的数据。如果自上次读取以来写入者尚未在一个槽中写入和提交新数据,则读取者应该等待(想想快速读取器)。
请注意,一个阅读器不得为另一个阅读器“消费”数据。换句话说,两个不同的读者可能读取相同的数据。同样,一个读者可能会从同一个插槽中读取数据两次或更多次,但前提是作者在两次读取请求之间向该插槽写入数据。
请注意,干扰器可能不适合我的情况(或者我只是没能按我的意愿让它工作)。 disruptor 的问题在于,写入器可能前进得如此之快(与较慢的读取器相比),以至于它最终可能会在读取过程中覆盖某些插槽。在这种情况下,编写器应该能够跳过这些“繁忙”的槽,直到它找到第一个空闲槽(一旦写入,它还必须仅发布那个槽),但中断器模式不会似乎在考虑这种情况。序列本身还有另一个问题,在我使用的干扰器实现中,它是一个原子整数,因此它可能会溢出,导致一些未定义的行为。
你有什么想法吗?如果您知道现代 C++ 中的解决方案,我将不胜感激。
最佳答案
我不知道这个问题的开箱即用的解决方案(注意:这并不意味着没有!)但是如果我尝试使用 c++11 工具实现它,我会看到如下内容:
当队列为空时写入器阻塞的写入器条件变量。
开始将所有索引(环形缓冲区的大小)排入队列。
A nice article on the C++11 concurrency features.
编辑 进一步思考这个建议试图做的是将数组中的插槽视为资源池。读取器获取资源、槽的索引,并在完成处理后返回。
更新的解决方案: 由于插槽的数量限制为最多 8 个,我建议您使解决方案尽可能简单。让每个插槽负责自己的状态:
#include <atomic>
template <typename T>
class Slot {
atomic_uint readers ;
int iteration ;
T data ;
}
然后创建一个 std:vector of Slots 并让读者和作者迭代这个向量。
编写器需要找到一个槽,其中 readers == 0
(并且可能具有 iteration
的最小值)并且当它找到时它需要减少读者数然后检查阅读器计数是否为 -1 以确保阅读器没有在 if 和递减之间开始阅读。如果是,则重新增加 readers
并重新开始。
Readers 遍历数组以查找他们尚未读取的最大iteration
值以及readers >= 0
的位置。然后他们重新检查 readers
的值,如果 Writer 没有将它设置为 -1,他们会增加它并开始阅读。如果 Writer 已经开始写入那个槽,那么 Reader 会重新开始。
假设 Writer 已将一个插槽标识为空闲,而 Reader 已决定它需要读取该插槽,有 2 个可能的排序,并且在 Reader 和 Writer 中都退缩并重试。
Execution Writer Reader
1 readers == 0
2 readers >= 0
3 readers--
4 readers++
5 readers == -1 is false
6 readers > 0 is false!
7 readers++
8 readers--
Execution Writer Reader
1 readers >= 0
2 readers == 0
3 readers++
4 readers--
5
6 readers == -1 is false
7 readers > 0 is false
8 readers++
9 readers--
如果 Reader 和 Writer 确实以这种方式发生冲突,则双方都无法访问并且都需要重试。
如果您对这种方法不满意,那么可以使用 Mutex 和锁/try_lock,在 Slot 类中类似这样的东西(注意:目前无法通过编译器运行它,因此可能有语法错误)
typedef enum LOCK_TYPE {READ, WRITE} ;
std::mutex mtx ;
bool lockSlot(LOCK_TYPE lockType)
{
bool result = false ;
if (mtx.try_lock()) {
if ((lockType == READ) && (readers >= 0))
readers++ ;
if ((lockType == WRITE) && (readers == 0))
readers-- ;
result = true ;
}
return result ;
}
void unlockSlot (LOCK_TYPE lockType)
{
if (mtx.lock()) { // Wait for a lock this time
if (lockType == READ)
readers-- ;
if (lockType == WRITE)
readers++ ;
}
}
当/如果一个 Reader 用完了工作,它可以等待一个条件变量,Writer 可以使用这个条件变量在新数据可用时通知所有()读者。
关于multithreading - 环形缓冲区,1 个写入器和 N 个读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212892/
我看到以下宏 here . static const char LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n,
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
所以我得到了这个算法我需要计算它的时间复杂度 这样的 for i=1 to n do k=i while (k<=n) do FLIP(A[k]) k
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我正在研究一种算法,它可以在带有变音符号的字符(tilde、circumflex、caret、umlaut、caron)及其“简单”字符之间进行映射。 例如: ń ǹ ň ñ ṅ ņ ṇ
嗯..我从昨天开始学习APL。我正在观看 YouTube 视频,从基础开始学习各种符号,我正在使用 NARS2000。 我想要的是打印斐波那契数列。我知道有好几种代码,但是因为我没有研究过高深的东西,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
谁能帮我从 N * N * N → N 中找到一个双射数学函数,它接受三个参数 x、y 和 z 并返回数字 n? 我想知道函数 f 及其反函数 f',如果我有 n,我将能够通过应用 f'(n) 来
场景: 用户可以在字符串格式的方程式中输入任意数量的括号对。但是,我需要检查以确保所有括号 ( 或 ) 都有一个相邻的乘数符号 *。因此 3( 应该是 3*( 和 )3 应该是 )*3。 我需要将所有
在 Java 中,表达式: n+++n 似乎评估为等同于: n++ + n 尽管 +n 是一个有效的一元运算符,其优先级高于 n + n 中的算术 + 运算符。因此编译器似乎假设运算符不能是一元运算符
当我阅读 this 问题我记得有人曾经告诉我(很多年前),从汇编程序的角度来看,这两个操作非常不同: n = 0; n = n - n; 这是真的吗?如果是,为什么会这样? 编辑: 正如一些回复所指出
我正在尝试在reveal.js 中加载外部markdown 文件,该文件已编写为遵守数据分隔符语法: You can write your content as a separate file and
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我最近偶然发现了一个资源,其中 2T(n/2) + n/log n 类型 的递归被 MM 宣布为无法解决。 直到今天,当另一种资源被证明是矛盾的(在某种意义上)时,我才接受它作为引理。 根据资源(下面
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我完成的一个代码遵循这个模式: for (i = 0; i < N; i++){ // O(N) //do some processing... } sort(array, array + N
有没有办法证明 f(n) + g(n) = theta(n^2) 还是不可能?假设 f(n) = theta(n^2) & g(n) = O(n^2) 我尝试了以下方法:f(n) = O(n^2) &
所以我目前正在尝试计算我拥有的一些数据的 Pearson R 和 p 值。这是通过以下代码完成的: import numpy as np from scipy.stats import pearson
ltree 列的默认排序为文本。示例:我的表 id、parentid 和 wbs 中有 3 列。 ltree 列 - wbs 将 1.1.12, 1.1.1, 1.1.2 存储在不同的行中。按 wbs
我的目标是编写一个程序来计算在 python 中表示数字所需的位数,如果我选择 number = -1 或任何负数,程序不会终止,这是我的代码: number = -1 cnt = 0 while(n
我是一名优秀的程序员,十分优秀!