我想使用一些跨平台的C++库来启动,停止和获取进程的标准输出.我发现并且我想使用C++ POCO库:这些好吗?
什么是最好的选择?我使用Boost并且他们有Boost Process,但不是官方发布和AFAIK的一部分它不会很快(发展在2008年停止).你能告诉我一下这个POCO lib或其他吗?
我试图通过设置后台线程来解决一个特定任务来加速一段代码.当我需要解决我的任务时,我想唤醒这些线程,完成工作并再次阻止它们等待下一个任务.任务总是一样的.
我尝试使用条件变量(和需要与它们一起使用的互斥量),但我最终减慢了代码速度,而不是加快速度; 主要是因为调用所有需要的函数非常昂贵(pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock
).
使用线程池没有任何意义(我没有),因为它是一个过于通用的构造; 在这里,我只想解决我的具体任务.根据实现情况,我还会为队列支付性能损失.
你有什么建议可以快速叫醒而不使用mutex
或con_var
吗?
我正在考虑设置线程,如定时器读取atomic variable
; 如果变量设置为1,则线程将完成工作; 如果它被设置为0,它们将进入睡眠状态几微秒(我会以微秒睡眠开始,因为我想避免使用spinlocks
它,这可能对CPU来说太昂贵).你怎么看待这件事?任何建议都非常感谢.
我使用的是Linux,gcc,C和C++.
我在下面尝试了这个虚拟代码来测试未命名的命名空间.
我有以下输出
ctor 1
ctor 0
3
5
Run Code Online (Sandbox Code Playgroud)
我对此有点困惑.
a::m_a
.相反,它总是指较少的嵌套.总是这样吗?C++遵循什么规则?m_a
从main()
?获取最嵌套的变量?class CMyObj{
public:
CMyObj(int a){std::cout << "ctor " << a << std::endl; }
};
namespace a{
namespace{
int m_a=4;
int m_b=5;
CMyObj m_obj(1);
}
}
namespace a{
int m_a=3;
CMyObj m_obj(0);
}
int main(){
std::cout << a::m_a << std::endl; // which one?
std::cout << a::m_b << std::endl; // how this is possible?
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读boost type erasure
,我正在试图找出潜在的用途.我想读一些关于这个主题的文档(它看起来很大),我想练习一下.引用最多的应用程序区域是在客户端和服务器之间联网/交换数据.你可以建议一些其他的例子或练习,我可以玩这个图书馆吗?
我正在一台服务器上工作,必须从同时连接的数千个套接字客户端读取.客户端请求由具有大约32字节的所有相同精确大小的消息构成.
我正在阅读关于这个问题,slab allocator
并且当我调用read
从套接字中获取数据时,我想将这种特殊技术用于我的应用程序(将read
数据从内核缓冲区复制到我选择的缓冲区中,我想使用一些内存动态分配).
在我阅读时,似乎Linux内核已经在使用这种技术了.如果用于实现malloc or new
,那么鉴于分配已经具有性能,我仍然值得这样做吗?
我认为在没有SLAB算法的情况下使用堆栈分配可能会更好,但我不确定哪种方法最好.
我正在TUI模式下使用GDB执行我的第一步.
在调试会话期间,我看到输出到控制台的每一行都出现在一行中(在您看到的图中222222
以红色突出显示).这就像拥有一行的输出窗格.
最重要的是,每个\n
都不清理该行,因此所有字符串都会相互覆盖,使我的输出非常混乱.
你能帮我解决一下这个问题,还是指点一些关键命令来寻找干净的输出?
我还突出显示了另一个区域(图中1111111
),因为第一个字符串是在那里输出的,然后是源代码窗口框架上的所有其他字符串.
我试图在调试(日志记录)时使用宏来显示控制台,显示成员值的变量名称.怎么做?我尝试了以下但它不起作用.
#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl;
int main(){
int my_variable=3;
MY_PRINT( my_variable );
// I would like to print to console
// 'my_variable'=3
}
Run Code Online (Sandbox Code Playgroud) 我正在使用boost::interpocess::scoped_lock
a named_mutex
和a timeout
; 我在Linux OS中运行.
在我的一次测试中,我遇到了崩溃:从那时起,每当我再次尝试运行应用程序时,它就会卡在我创建锁的位置; 看起来互斥体仍然以某种方式获得(没有可能使用它的进程正在运行).
最重要的是,如果你看下面的代码,我希望在150微秒后,定时scoped_lock
返回给我一个错误..但事实并非如此......只是挂在那里.
#include <boost/interprocess/sync/named_mutex.hpp>
namespace bi = boost::interprocess;
bi::named_mutex m_mutex;
try{
boost::posix_time::ptime pt(
boost::posix_time::microsec_clock::local_time() ) ;
pt+= boost::posix_time::microseconds( 150 );
bi::scoped_lock< bi::named_mutex > lock( m_mutex, pt );
if( !lock.owns() ){
FATAL( "I didn't acquire the lock." );
return EXIT_FAILURE;
}
....
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
boost::interprocess
命名的互斥锁被销毁?(那么如何在进程中查看共享的互斥锁以及如何销毁它们)非常感谢
AFG
我对基本的C++用法有疑问.下面的代码,使用gcc/LInux编译,正确打印出来.
字符串test
超出范围所以它的c_str()
值也应该是无效的不是吗?我错了还是误解了const char*
意思?
#include <iostream>
int main(){
const char* a = "aaaa";
std::cout << a;
{ std::string test("bbbb");a=test.c_str();}
std::cout << a;
a = "cccc";
std::cout << a;
}
aaaabbbbcccc
// print out without any problem
Run Code Online (Sandbox Code Playgroud) 我想根据是否-std=c++0x
使用来定义一个宏.如果我尝试下面的宏我有错误error stray '#' in program
.
下面的代码是否错误/是否允许C++ #if / #endif
在a中使用预处理器#define
?
#define DEF_ME (p) \
#if __GXX_EXPERIMENTAL_CXX0X__ \
#endif
Run Code Online (Sandbox Code Playgroud)
我在Linux中使用g ++ 4.4.7.
c++ ×7
c ×2
macros ×2
performance ×2
atomic ×1
boost ×1
char ×1
constants ×1
debugging ×1
g++ ×1
gdb ×1
interprocess ×1
ipc ×1
linux ×1
memory ×1
mutex ×1
namespaces ×1
sockets ×1
string ×1
type-erasure ×1