编程小知识

来源:互联网 发布:采集助手数据库 编辑:程序博客网 时间:2024/06/05 14:31

1. 多核CPU对单个线程

一般来说,一个线程,对多核CPU来说,其对CPU的利用率应该低于 “1/核心数”(前提是只有该线程在运行) 。因为CPU只能在一个核上执行单线程程序,而且没有绑定该程序到哪个核上的话(Windows的话用API:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx),那么系统会随机调度该程序到一个核上执行,挂起再执行的时候又可能在另外一个核上。

2. 单工,半双工,全双工

数据通信中,数据在线路上的传送方式可以分为单工通信半双工通信全双工通信三种。

<单工>:指消息只能单方向传输的工作方式。例如遥控、遥测。

<半双工>:数据可以在一个信号载体的两个方向上传输,但是不能同时传输。USB2.0是半双工的。

<全双工>:发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。

3. 串行通信接口,并行通信接口

注意:此处的串行指的是一位一位的传输,并行一般是一次传输一个字或一个字节,需要多线路的支持。

常见的串行通信接口:RS232,USB,网络,IIC,SPI

4. 互斥量

Mutex可以分为递归锁(recursive mutex)非递归锁(non-recursive mutex)。可递归锁也可称为可重入锁(reentrant mutex)非递归锁又叫不可重入锁(non-reentrant mutex)。  二者唯一的区别是,同一个线程可以多次获取同一个递归锁,不会产生死锁。而如果一个线程多次获取同一个非递归锁,则会产生死锁。

5. Linux修改时间

下面4个都可以:

date -s "20120827 15:04:00" 

或者

date -s "2012-08-27 15:04:00"

或者

date -s "15:04:00 2012-08-27"

或者

date -s "15:04:00 20120827"

6. 对于 32bit 和 64bit 的系统,程序需要链接库时,如果我们的编译器是32的,那么对于64的库,往往就编译不过去,偶们就要想一下是不是库的问题。如果对于".lib"编译成功了,链接 “.dll” 出现错误:文件无效或损坏,也有可能是该库和编译器的位数不匹配导致。

7. 对于回调函数的蛋疼解决办法

     采用异步回调机制往往是更高效的,但回调函数往往要定义成static的,或者是一个全局函数,这样当我们需要使用自定义参数或者自己类中的非static变量或函数就比较麻烦了。

     1>. 为回调函数添加一个 void *arg 的形参,传入自定义的参数,或者类指针

     2>. 使用 boost::bind ,即绑定器

     3>. 在类中添加一个 static 指针, static className* p_;  这样需要将类变量或函数写成public的

8. 如果链接时使用的库不在系统默认的文件目录下,程序往往即使编译过去了还是会无法运行,因为找不到链接的库文件,常常会出现在交叉编译时的开发上。可以指定链接路径,如下:

arm-linux-gnueabihf-g++ main.cpp  -o server_arm_myir -I /opt/embedded/libuv_julei_myir/include/ -L /opt/embedded/libuv_julei_myir/lib/ -luv -Wl,-rpath=/opt/embedded/libuv_julei_myir/lib/

9. auto tools的库文件编译

    往往在编译库文件时,作者并没有提供configure这个脚本文件,因为这个脚本是由auto tools从configure.ac等文件生成的。这个时候你的系统上就应该有automake,autoconf等工具来生成configure。

10. 缺少 libudev.h 文件或 error: "udev support requested but libudev not installed"

    apt-get install libudev-dev

11. 



0 0