我正在使用ConcurrentQueue共享数据结构,其目的是保存传递给它的最后N个对象(历史记录类型).
假设我们有一个浏览器,我们希望最后100个浏览Urls.我想要一个队列,当容量变满时(历史中的100个地址),当新条目插入(入队)时自动删除(出列)最旧的(第一个)条目.
我怎样才能实现这个目标System.Collections?
哪个STL容器最适合我的需求?我基本上有一个10个元素的宽容器,在这个容器中我不断使用push_back新元素pop_front(大约一百万次).
我目前正在使用a std::deque来执行任务,但是想知道是否std::list会更高效,因为我不需要重新分配自己(或者我可能会误认为std::deque是std::vector?).或者是否有更高效的容器满足我的需求?
PS我不需要随机访问
我想通过Java中的类实现FIFO.
这样的课程已经存在吗?如果没有,我该如何实现自己的?
注意
我在这里找到了一个类http://www.dcache.org/manuals/cells/docs/api/dmg/util/Fifo.html,但它不包含dmg.util.*.我不知道这样的包装是否存在.
在使用Python在各种UNIX(Linux,FreeBSD和MacOS X)下处理命名管道(FIFO)时,我注意到了一些奇怪的事情.第一个,也许是最烦人的是尝试打开空闲/空闲FIFO只读将被阻止(除非我使用os.O_NONBLOCK较低级别的os.open()调用).但是,如果我打开它进行读/写,那么我就不会阻塞.
例子:
f = open('./myfifo', 'r') # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY) # ditto
# Contrast to:
f = open('./myfifo', 'w+') # does NOT block
f = os.open('./myfifo', os.O_RDWR) # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK) # ditto
Run Code Online (Sandbox Code Playgroud)
我只是好奇为什么.为什么打开调用块而不是后续的一些读操作?
另外我注意到非阻塞文件描述符可以表现为Python中的不同行为.在我使用的情况下os.open()与os.O_NONBLOCK初始开启操作那么os.read()似乎如果数据还没有准备好文件描述符返回一个空字符串.但是,如果我使用fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)然后os.read引发异常(errno.EWOULDBLOCK)
是否有一些其他标志open()由我的os.open()例子未设置的法线设置?它们有什么不同,为什么?
任何人都可以提出转到容器,简单快速的FIF /队列,Go有3个不同的容器:heap,list和vector.哪一个更适合实现队列?
有很多问题表明应该总是使用向量,但在我看来,列表对于场景更好,我们需要存储"最后n个项目"
例如,假设我们需要存储最后看到的5个项目:迭代0:
3,24,51,62,37,
Run Code Online (Sandbox Code Playgroud)
然后在每次迭代时,删除索引0处的项目,并在末尾添加新项目:
迭代1:
24,51,62,37,8
Run Code Online (Sandbox Code Playgroud)
迭代2:
51,62,37,8,12
Run Code Online (Sandbox Code Playgroud)
似乎对于这个用例,对于向量,复杂度将是O(n),因为我们必须复制n个项目,但是在列表中,它应该是O(1),因为我们总是只是砍掉了头部,并在每次迭代时添加到尾部.
我的理解是否正确?这是std :: list的实际行为吗?
我有两个程序,Writer和Reader.
我有一个从Writer到Reader的FIFO,所以当我在Writer中写入stdin的东西时,它会从Reader打印到stdout.
我尝试打开两个读者,并且只从两个Reader程序中的一个输出到stdout.每次运行时,Unix选择打印标准输出的读者程序似乎是任意的,但是一旦选择了其中一个程序,每个输出到标准输出都会从同一个Reader程序打印出来.
有谁知道为什么会这样?
如果我有两个WRITER程序,它们都可以写入同一个管道.
我喜欢按需"记录"节目输出.例如.输出记录到终端,但另一个进程可以随时挂接当前输出.
经典的方式是:
myprogram 2>&1 | tee /tmp/mylog
Run Code Online (Sandbox Code Playgroud)
并按需提供
tail /tmp/mylog
Run Code Online (Sandbox Code Playgroud)
但是,这将创建一个不断增长的日志文件,即使在驱动器空间不足之前不使用它也是如此.所以我的尝试是:
mkfifo /tmp/mylog
myprogram 2>&1 | tee /tmp/mylog
Run Code Online (Sandbox Code Playgroud)
并按需提供
cat /tmp/mylog
Run Code Online (Sandbox Code Playgroud)
现在我可以随时阅读/ tmp/mylog.但是,任何输出都会阻塞程序,直到读取/ tmp/mylog.我喜欢fifo来刷新任何未读回的数据.怎么做?
我正在尝试为我工作的公司创建一个(网络)同步数组.虽然网络部分工作正常,但我已经陷入了一个问题.
我希望创建一个新队列使用dispatch_create_queue,我将添加两个不在主线程上运行的块,但是以串行方式运行,这意味着首先必须运行第一个块,然后是第二个块,而不是平行.
我已经阅读了苹果文档,但至少可以说是令人困惑的.
当我使用创建队列dispatch_queue_create然后使用时添加块(在它们被定义之后)dispatch_sync,我发现该块仍然在主线程上执行.
使用时dispatch_async,即当主线程上没有执行块时.
当我尝试使用dispatch_sync它们添加两个块时永远被阻止.
两个块似乎运行良好并且离开主线程的唯一时间是在调用时dispatch_async.
然而,我之所以选择GCD和同步方法,是因为我的印象是我正在创建一个新队列(因此是一个新线程),并且向该队列添加块只会阻塞一个,直到另一个完成执行.是不是这种情况,或者创建队列不保证代码不会在主线程上运行?
fifo ×10
c# ×2
c++ ×2
queue ×2
.net ×1
bash ×1
buffering ×1
c++11 ×1
data-stream ×1
file-io ×1
go ×1
java ×1
linux ×1
logging ×1
named-pipes ×1
nonblocking ×1
objective-c ×1
posix ×1
stl ×1
unix ×1