这个问题让我质疑我多年来一直遵循的做法.
对于函数本地静态const对象的线程安全初始化,我保护对象的实际构造,但不保护引用它的函数本地引用的初始化.像这样的东西:
namespace {
const some_type& create_const_thingy()
{
lock my_lock(some_mutex);
static const some_type the_const_thingy;
return the_const_thingy;
}
}
void use_const_thingy()
{
static const some_type& the_const_thingy = create_const_thingy();
// use the_const_thingy
}
Run Code Online (Sandbox Code Playgroud)
这个想法是锁定需要时间,如果引用被多个线程覆盖,那么无关紧要.
如果是的话,我会感兴趣的
我想知道这个的原因是我想知道我是否可以保留代码,或者我是否需要回去修复它.
对于探究的头脑:
我使用的许多这样的函数本地静态const对象是在首次使用时从const数组初始化并用于查找的映射.例如,我有一些XML解析器,其中标记名称字符串映射到enum
值,因此我可以稍后switch
覆盖标记的enum
值.
由于我得到了一些关于该做什么的答案,但是没有得到我实际问题的答案(见上文1.和2.),我会对此开始赏金.还是那句话:
我不感兴趣,我能做什么,而不是,我真的想知道这个.
因此,我们需要检测由扫描仪创建的图像是否代表空白页面.在图像处理方面,我已经超出了我的深度,所以我必须由社区运行.
这是我到目前为止所提出的:
空页可以是明显的白色,灰色再生纸或泛黄的旧纸.目前的想法是为页面创建直方图,寻找曲线的急剧增加,并使像素的百分比比这更暗.如果超过阈值,页面可能不为空.
由于这可能会将包含顶部单行文本的页面分类为空,我们会平铺页面并收集有关每个图块的统计信息.
我们需要从绑定中检测扫描的订书机和孔(可能只在某些图块中),但这可以推迟到稍后阶段.但是,如果你知道除了这两个之外还要注意什么,请在评论中提及.
这需要很快.它是文档处理工作流程的一部分,每天处理(数十万)页面.如果处理页面的时间要长十秒,那么我们的客户将不得不告诉他们的客户他们将需要等待几天才能获得结果.(如果这导致更多的误报,一些客户宁愿让某人检查几十个被发现的"空"页面,而不是让他们的客户再等一天.)
所以这是我的问题:
采取这条路线是不是一个好主意,还是有更好的东西?
如果我们这样做,我该怎么做?找到页面阈值的好(便宜)算法是什么?我们可以通过为一批文件假设一个类似的门槛来获得显着的速度吗?在记录之前,亮度值可以精确到哪个精度值?我们可以期待什么怪癖?
我正在扩展现有的日志记录库.它是一个有两面的系统:前端是任务将日志消息写入的位置,后端是应用程序可以插入侦听器的位置,将这些消息转发到不同的接收器.后端曾经是一个硬连线的监听器,我现在正在扩展这个灵活性.该代码专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标.
出于性能原因,消息被缓冲,并且转发在后台任务中完成.该任务从队列中提取一大块消息,将它们全部格式化,然后通过已注册的函数将它们传递给侦听器.这些侦听器将过滤消息,并且只会将这些消息写入通过过滤条件的接收器.
鉴于此,我最终得到了N
发送M
消息的通知函数(侦听器),这是一个相当经典的N*M
问题.现在我有两种可能性:我可以遍历消息,然后循环通过将消息传递给每个消息的通知函数.
for(m in formatted_messages)
for(n in notification_functions)
n(m);
void n(message)
{
if( filter(message) )
write(message);
}
Run Code Online (Sandbox Code Playgroud)
或者我可以循环遍历所有通知函数,并将它们立即传递给我:
for(n in notification_functions)
n(formatted_messages);
void n(messages)
{
for(m in messages)
if( filter(m) )
write(m);
}
Run Code Online (Sandbox Code Playgroud)
关于哪种设计更有可能允许每个时间片处理更多数量的消息,是否有任何基本考虑因素?(注意这个问题如何决定听众的界面.这不是一个微优化问题,而是一个关于如何使设计不妨碍性能的问题.我只能在很长一段时间后进行测量,然后重新设计监听器接口将会很昂贵.)
我已经做了一些考虑:
一个C++问题,
我知道
int* foo(void)
Run Code Online (Sandbox Code Playgroud)
foo将返回一个指向int类型的指针
怎么样
int &foo(void)
Run Code Online (Sandbox Code Playgroud)
什么回来了?
非常感谢!
我正在使用多个线程在C中实现图像过滤操作,并使其尽可能优化.我有一个问题:如果一个内存被thread-0访问,并且如果同一个内存被thread-1访问,它是否会从缓存中获取它?这个问题源于这两个线程可能运行到CPU的两个不同核心的可能性.所以另一种方法是:所有内核是否共享相同的公共缓存?
假设我有如下的内存布局
int输出[100];
假设有2个CPU核心,因此我产生两个线程同时工作.一种方案可以是将内存分成两个块,0-49和50-99,并让每个线程在每个块上工作.另一种方法是让线程0在偶数索引上工作,比如0 2 4等等.而另一个线程工作在奇数索引上,比如1 3 5 ......这个后来的技术更容易实现(特别是对于3D)数据)但我不确定我是否可以通过这种方式有效地使用缓存.
我有一节课:
class A
{
public:
virtual void func() {...}
virtual void func2() {...}
};
Run Code Online (Sandbox Code Playgroud)
还有一些来自这个的派生类,比方说B,C,D ...在95%的情况下,我想要遍历所有对象并调用func或func2(),因此我将它们放在向量中,如:
std::vector<std::shared_ptr<A> > myVec;
...
for (auto it = myVec.begin(); it != myVec.end(); ++it)
(*it).func();
Run Code Online (Sandbox Code Playgroud)
但是,在剩下的5%的情况下,我想根据它们的子类做一些不同的类.我的意思完全不同,比如调用带有其他参数的函数或者根本不为某些子类调用函数.我想到了一些解决这个问题的方法,我都不喜欢这个方案:
还将类放在其他向量中,每个向量用于其特定任务.这也不觉得OO,但也许我错了.喜欢:
std::vector<std::shared_ptr<B> > vecForDoingSpecificOperation;
std::vector<std::shared_ptr<C> > vecForDoingAnotherSpecificOperation;
Run Code Online (Sandbox Code Playgroud)那么,有人可以建议一种能达到我想要的风格/模式吗?
例如,做:
wchar_t x;
Run Code Online (Sandbox Code Playgroud)
翻译成:
unsigned short x;
Run Code Online (Sandbox Code Playgroud) 我一直在网上阅读C++,这是我无法找到答案的一件事.
我知道函数中使用的静态变量类似于全局变量,并且该函数的后续调用将使静态变量在调用之间保持其值.
但是,如果从未调用该函数,静态变量是否会被分配?
谢谢
我如何(以编程方式)将文件的写权限授予Linux中的特定用户?比如,它的拥有者?每个人都有对此文件的读取权限.
在以下程序中
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss("-89");
std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
unsigned int u;
iss >> u;
std::cout << static_cast<bool>(iss) << iss.good() << iss.fail() << iss.bad() << iss.eof() << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
流lib将一个有符号的值读入一个unsigned int
甚至没有打嗝的情况下,默默地产生错误的结果:
11000
10001
Run Code Online (Sandbox Code Playgroud)
我们需要能够捕获那些运行时类型不匹配错误.如果我们还没有在模拟中发现这一点,这可能会炸毁非常昂贵的硬件.
我们如何安全地从流中读取无符号值?