Menu Home

cpp

CPP: SFINAE

SFINAE(Substitution failure is not an error)是C++范型编程中的概念。 对SFINAE简单的理解是,当编译器发现最佳模版匹配失败的时候,不报错,而是继续寻找第二匹配。 在Java中我们可以通过反射机制来判断某个类中是否包含了某个方法,但是C++没有反射,但可以通过SFINAE来达到同样的目的。 WIKI中提供了一个非常简洁的代码片段来演示SFINAE: struct Test { typedef int foo; }; template <typename T> void f(typename T::foo) {} // Definition #1 template <typename T> void f(T) {} // Definition #2 int main() { f<Test>(10); // Call #1. f<int>(10); // Call #2. Without error (even though […]

[转]A fast lock-free queue for C++

Sharing data between threads in annoying. Really annoying. If you do it wrong, the data is likely to become corrupted. Even more error-prone is ensuring the shared data is perceived in the right order (relative to other data reads/writes). There are, as always, two ways to deal with this: The […]

Linux线程的调度策略与优先级

调度策略有3种: SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。 SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。 SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。 这3个宏在 sched.h 中定义。 线程优先级: 不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值: int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 参数policy是上面介绍的调度策略中的SCHED_FILO或SCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。 查询和设置调度策略: int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param); 查询和设置线程优先级: 查询: struct sched_param param; //首先查询线程的调度策略,赋给param //参数attr是create线程时所使用的线程属性 pthread_attr_getschedparam(attr, &param); //从sched_param结构中获取线程优先级 param.__sched_priority; 设置: pthread_attr attr; struct sched_param param; […]

macos使用ZThread:lazy symbol binding failed

OS: macos 使用编译命令: g++ -Wall -g -o a a.cpp -lzthread 编译顺利通过,运行时出现如下报错: dyld: lazy symbol binding failed: Symbol not found: _MPCreateCriticalRegion Referenced from: /usr/local/lib/libZThread-2.3.2.dylib Expected in: flat namespace dyld: Symbol not found: _MPCreateCriticalRegion Referenced from: /usr/local/lib/libZThread-2.3.2.dylib Expected in: flat namespace Trace/BPT trap: 5 解决方法: 需要在编译时加入carbon framework: g++ -Wall -g -o a […]

linux c清理系统文件缓存—— posix_fadvise

OS : opensuse11.4 需求:判断磁盘是否存在,不想搞的很复杂也不想用写的方式来确定磁盘的存在,所以就想用读的方式来确定,但是呢,系统有cache,所有即使在拔去硬盘的情况下依然能读到文件,尝试了O_SYNC O_DIRECT对read都无效,搞了整1天,汗流浃背,找啊找啊,用posix_fadvise可以达到目的。有别的简单方法的,求指教。 ps : 一个好工具vmtouch 代码示例:

类型转换函数

用转换构造函数可以将一个指定类型的数据转换为类的对象. 用类型转换函数(type conversion function)可以将一个类的对象转换为一个指定类型的数据. 类型转换函数的一般形式为: operator 类型名() {实现转换的语句} 在函数名前面不能指定函数类型,函数没有参数. #include <string> #include <iostream> using namespace std; class A { string s; public: A() : s(“hello”) {} virtual ~A() {} operator const string&() { return s; } }; int main() { A a; cout << string(a) << endl; }

LINUX下QT For ARM开发环境

LINUX下QT For ARM开发环境 OS: ubuntu 12.1 gcc: 4.6.3 arm gcc: 4.5.1 QT: qt-x11-opensource-src-4.5.3 QT-embedded: qt-embedded-linux-opensource-src-4.5.3 编译qt-x11-opensource-src-4.5.3 ./configure –qvfb make cd tools/qvfb //进入此目录,准备对它进行编译 make sudo make install 编译过程中出现的错误: error: ‘ppd_file_t’ does not name a type 解决方法: 打开src/gui/painting/qcups_p.h做如下修改: #ifndef QT_NO_CUPS #include //加入ppd头文件 QT_BEGIN_NAMESPACE 安装 arm-linux-gcc (略) 编译qt-embedded-linux-opensource-src-4.5.3 ./configure -embedded arm -qt-libpng make […]

c++ error: cannot have cv-qualifier

C: const V: volatile 说明:在C++中 非成员函数不能有CV限定 静态成员函数不能有CV限定 例子: 第一种情况:非成员函数不能有CV限定 #ifndef _HEAD_H #define _HEAD_H class A { public: static void print() const; //错误 }; #endif //_HEAD_H 第二种情况:静态成员函数不能有CV限定 #ifndef _HEAD_H #define _HEAD_H void print() const; //错误 #endif //_HEAD_H