小编BSc*_*ker的帖子

在C++中重载比较运算符导致"无效运算符<"

目前正在尝试使用C++对对象的矢量进行排序,每个对象包含一个字符串

字符串可以包含字母或数字(由于设计约束,这是必要的,因为比较器可以更改).

目前,对象的类被重载,因此当比较两个对象时,它们包含的字符串将被比较.这是有用的 - 然而,当我使用排序操作(例如STL排序)按顺序放置对象时,它将按顺序排序三个字符串,如"1","4","12" "1","12","4".4大于12,但因为它从最左边的数字开始比较,所以发生这种"不正确"的排序.

我最初的反应是改变比较操作的重载方式.我首先检查我正在比较的字符串的长度 - 如果字符串的内容大或小,这将是一个标志符号.

// overloaded comparision operators
friend bool operator<(const nodeRecord & record1, const nodeRecord & record2){
    // we need to deal with strings of different lengths...
    if(record1.comparator.length() < record2.comparator.length())
        return true;
    else
        return (record1.comparator < record2.comparator);
}
Run Code Online (Sandbox Code Playgroud)

此操作在运行时期间导致"Expression:invalid operator <"消息.

关于我犯错误的任何想法?似乎我应该能够准确地指示操作如何进行排序操作 - 即使它是无效的,因为我当前正在使用向量来包含对象.

初始化nodeRecord对象时的比较器:

nodeRecord(int fromNode, int toNode, int connectionCost, bool compareByCost = false){
    // take the provided stock information and insert it into the object
    stringstream fromNodeSS;
    fromNodeSS << fromNode;
    this->fromNode = …
Run Code Online (Sandbox Code Playgroud)

c++ sorting overloading operator-overloading operators

7
推荐指数
1
解决办法
5363
查看次数

重新初始化timeval结构

如何从time.h重新初始化timeval结构?

我意识到我可以将结构的两个成员重置为零,但是我还有其他方法可以忽略吗?

c++ struct timeval

7
推荐指数
2
解决办法
1万
查看次数

OpenCV中的FeatureDetector与FeatureFinder

我试图理解FeatureDetector班级和FeatureFinder班级之间的区别.我已经看到在OpenCV中编写的全景示例使用这两个类,并且似乎可以将SURF算法与其中任何一个一起使用.据我所知,由于SURF算法可能出现问题而SURF FeatureDetector被移动/nonfree,但是,FeatureFinder也可以采用该SURF算法.

这两个班级有什么区别?

opencv surf feature-detection

7
推荐指数
1
解决办法
540
查看次数

在POSIX中以微秒粒度调度事件

我正在尝试确定我可以准确地安排在C/C++中执行任务的粒度.目前我可以可靠地安排任务每5微秒发生一次,但我试图看看是否可以进一步降低这一点.

关于如何实现这一目标的任何建议/如果可能的话,将不胜感激.

因为我知道计时器粒度通常可以依赖于操作系统:我目前在Linux上运行,但如果时序粒度更好,则会使用Windows(虽然我不相信它,基于我在QueryPerformanceCounter中找到的)

我在裸机上执行所有测量(没有VM)./proc/timer_info确认我的CPU的纳秒定时器分辨率(但我知道这不会转换为纳秒警报分辨率)

当前

我现在的代码可以在这里找到

目前,我能够每5微秒(5000纳秒)执行一次请求,迟到的次数少于1%.当迟到确实发生时,它们通常仅落后一个周期(5000纳秒).

我现在正做三件事

将进程设置为实时优先级(这里有一些由@ Spudd86指出)

struct sched_param schedparm;
memset(&schedparm, 0, sizeof(schedparm));
schedparm.sched_priority = 99; // highest rt priority
sched_setscheduler(0, SCHED_FIFO, &schedparm);
Run Code Online (Sandbox Code Playgroud)

最大限度地减少计时器松弛

prctl(PR_SET_TIMERSLACK, 1);
Run Code Online (Sandbox Code Playgroud)

使用timerfds(2.6 Linux内核的一部分)

int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
struct itimerspec timspec;
bzero(&timspec, sizeof(timspec));
timspec.it_interval.tv_sec = 0;
timspec.it_interval.tv_nsec = nanosecondInterval;
timspec.it_value.tv_sec = 0;
timspec.it_value.tv_nsec = 1;

timerfd_settime(timerfd, 0, &timspec, 0);
Run Code Online (Sandbox Code Playgroud)

可能的改进

  1. 将处理器专用于此过程?
  2. 使用非阻塞timerfd,这样我就可以创建一个紧密循环,而不是阻塞(紧密循环会浪费更多CPU,但也可能更快响应警报)
  3. 使用外部嵌入式设备进行触发(无法想象为什么会更好)

为什么

我目前正在为基准测试引擎创建工作负载生成器.工作负载生成器使用泊松过程模拟到达率(X请求/秒等).从泊松过程中,我可以确定必须从基准测试引擎发出请求的相对时间.

因此,例如,在每秒10次请求时,我们可能会发出以下请求:t = 0.02,0.04,0.05,0.056,0.09秒

这些请求需要提前安排然后执行.随着每秒请求数的增加,调度这些请求所需的粒度也会增加(每秒数千个请求需要亚毫秒精度).结果,我试图弄清楚如何进一步扩展这个系统.

c posix real-time timer poisson

7
推荐指数
1
解决办法
1442
查看次数

验证变量参数是预期类型

我正在编写一个函数,它将采用可变数量的参数.我将参数的数量传递给函数,然后遍历参数列表.

每个传递的参数都应该是一个整数.我将把这个整数添加到一个整数向量中,稍后将使用它.

我想确保一些小丑不会尝试将此函数传递给将来的整数.我认识到我可以检查来自va_arg的当前参数以确保它不是NULL并且我可以使用类似isanum(va_arg())来确定它是否是有效整数.我想我甚至可以检查sizeof(va_arg)并将其与sizeof(int)进行比较并确保它们相等.

是否有任何其他检查我可以运行以验证我已经传递了一个有效的整数?

在此先感谢您的帮助

c++ arguments variadic-functions

6
推荐指数
1
解决办法
2011
查看次数

信号处理程序访问队列数据结构(竞争条件?)

我目前正在用C++编写一个小shell.

作业和与它们相关的PID存储在作业指针队列中(job *).运行新作业时,会将有关它的信息添加到队列中.由于可以同时处理多个作业,并且可以随时在shell控制台输入新作业,因此我有一个信号处理程序可以等待已终止的作业.

当作业终止时,我需要从活动作业队列中删除它的信息并将其移动到已终止作业的双端队列中.但是,当另一个作业停止时,可能会将用户的新作业添加到队列中.

在这种情况下,它们的insert队列操作将被暂停,我的信号处理程序将被调用,这将执行它的pop操作.

我试图了解如何解决这种潜在的竞争状况,因为我想在此过程中可能会发生腐败.我不能使用互斥锁,因为如果中断的父进程当时正在使用队列,则会发生死锁.

我看到一些关于C++11能够进行用户声明的原子操作的信息,以及有关tasklet的信息.我不确定这些是否与我的问题相关.

有趣的是,我作为参考使用的示例shell(MSH - http://code.google.com/p/mini-shell-msh/)似乎没有对这些条件进行任何处理.信号处理程序立即修改作业列表以及主控制台.也许我在这里可以忽略一些东西?

与往常一样,所有反馈都是适当的.

c++ shell exec signal-handling race-condition

6
推荐指数
1
解决办法
565
查看次数

多个套接字连接

我需要编写一个服务器来接受来自多个客户端计算机的连接,维护已连接客户端的跟踪并根据需要发送单个客户端数据.有时,可以使用相同的消息立即联系所有客户端,有时可以是一个客户端或一组客户端.

由于我需要确认客户端收到信息并且不想为UDP连接构建ACK结构,因此我决定使用TCP流方法.但是,我一直在努力了解如何维护多个连接并使它们保持空闲状态.

我似乎有三个选择.对每个传入连接使用fork来创建单独的子进程,使用pthread_create为每个进程创建一个完整的新线程,或使用select()在所有打开的套接字ID上等待连接.

关于如何攻击这个的建议?我已经开始使用pthreads,但由于性能可能不是问题,因此多核处理不是必需的,也许有一种更简单的方法.

c++ sockets network-programming tcp pthreads

5
推荐指数
1
解决办法
2385
查看次数

理解随机数发生器的泊松分布

我正在使用C++ 11中提供的随机数生成器.目前,我正在使用统一分布,这应该给我一个相同的概率来获得我指定的A和B范围内的任何数字.

但是,我对生成泊松分布感到困惑.虽然我理解如何确定泊松概率,但我不明白如何根据泊松分布"随机分布"一系列随机数.

例如,泊松分布的C++ 11构造函数采用一个参数--λ,即分布均值

std::tr1::poisson_distribution<double> poisson(7.0);
std::cout << poisson(eng) << std::endl;
Run Code Online (Sandbox Code Playgroud)

在泊松概率问题中,这等于给定间隔期间的预期成功/发生次数.但是,我不明白它在这个例子中代表什么.随机数场景中的"成功"/"发生"是什么?

我感谢任何帮助或参考资料,我可以用它来帮助我理解这一点.

c++ random poisson

5
推荐指数
1
解决办法
4411
查看次数

使用其内核命名空间PID从全局范围中终止进程

今天在Linux内核命名空间方面遇到一些困难,特别是将唯一PID命名空间内的PID与全局PID命名空间内的PID相关联

我需要能够执行以下操作之一:

a)使用命名空间分配的PID从全局范围中终止进程

要么

b)将特定于命名空间的PID转换为全局PID,因此我可以从全局范围中删除PID

要么

c)在PID命名空间内启用进程以向我报告其全局PID,因此我可以从全局范围中终止PID

有在包含在命名空间场景的PID信息的流程结构进行一些讨论在这里.我不确定如何/如果我可以从用户态应用程序访问这些结构,或者我是否需要通过内核hack添加支持.

为什么? 我有一个当前使用网络命名空间的应用程序.我正在添加对PID命名空间的支持.以下是它目前的工作原理:

在引入PID命名空间之前: 主应用程序当前在另一个网络命名空间中启动bash控制台.然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID.当主应用程序想要杀死该网络命名空间中的子进程时,它只是告诉操作系统杀死报告的PID.

使用PID命名空间(损坏状态): 主应用程序当前在另一个网络和PID命名空间中启动bash控制台.然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID.但是,报告的当前PID在全局PID命名空间中无效(当全局命名空间中的PID为56000时,它可能为10).因此,主应用程序无法终止该网络+ PID命名空间中的子进程

与往常一样,任何指导表示赞赏

c linux kernel pid linux-namespaces

5
推荐指数
1
解决办法
1001
查看次数

用汇编打印十六进制数字

我正在努力学习NASM程序集,但我似乎正在努力解决高级语言中的问题.

我正在使用的所有教科书都使用字符串进行讨论 - 实际上,这似乎是他们最喜欢的东西之一.打印你好世界,从大写改为小写等

但是,我试图了解如何在NASM程序集中增加和打印十六进制数字,并且不知道如何继续.例如,如果我想在Hex中打印#1 - n,那么如果不使用C库(我能够找到使用的所有引用),我该怎么办呢?

我的主要想法是在.data部分有一个变量,我将继续增加.但是如何从此位置提取十六进制值?我似乎需要先将它转换为字符串......?

任何建议或示例代码将不胜感激.

x86 assembly masm nasm

4
推荐指数
1
解决办法
1万
查看次数