问几个平时大家不注意的问题哈
第一个是关于大小端的
如果之前的芯片是大端的现在变成小段了
有个函数
static void func( void *data )
{
U8 *read_data;
read_data = (U8*)data;
......................
}
但是调用的地方传什么样参数都有,比如说int ,long long,unsigned long,unsigned char等等,我该如何对应呢。
我的想法是按照最长的去对应
static void func( void *data )
{
#ifdef LITTLE_ENDIAN_SUPPORT
(long long*)data = (long long*)data & 0xFF00000000000000;
data >>= 56;
#else
#endif /* LITTLE_ENDIAN_SUPPORT */
write_data = (U8*)data;
......................
}
不知道这样处理可以么?但是有符号和无符号之前用不用考虑,我有点迷惑
2.是关于互斥锁的
比如说我定义了 static pthread_mutex_tmutex[3]
然后分别初始化三个 mutex
pthread_mutex_lock(mutex[0]);
.....一些处理......
pthread_mutex_unlock(mutex[0]);
当mutex[0]锁住的时候,mutex[1]可以进入那些处理么?
3。是关于fork的,为什么总有一些设计模式是fork一个子进程,由子进程去处理,而父进程只是在哪里等待
子进程处理完毕退出,直接用父进程不可以么?为什么还要fork?
[解决办法]
3. 父进程是界面,子进程是 复杂计算,这个时候如果用ui执行计算 会让界面死掉,, 或者父进程是服务,针对一个一个的client链接,如果只处理某个连接,则 另外的client会饿,想象一下你打游戏连不上服务器的场景吧。。。
2. 互斥锁是不锁自己函数的,比如你用 进程ThreadA调用互斥,那么再次用ThreadA是可以进入互斥的,
与其对应的叫做自旋锁, 锁住了谁都不能进包括自己
1.data >>= 56; 这个可以吗??第一次碰到??
大端转小断非常容易,, 别考虑神马符号, 那是显示的问题, 主要是转换
这个时候一定要确认你要转换的位数,否则出错,
转换时最好用unsigned char* pByte;
比如大端int 转换为 小端int, 字节流 pByteBuf 存储大端数据, 还要给个参数int nSize
int nReturn;
pByte = (unsigned char*) &nReturn;
pByte[0] = pByteBuf[3];
pByte[1] = pByteBuf[2];
pByte[2] = pByteBuf[1];
pByte[3] = pByteBuf[0];
long ,double 同理,,
[解决办法]
关于大小端的问题,指针本身是不存在的,
static void func( void *data ){#ifdef LITTLE_ENDIAN_SUPPORT(long long*)data = (long long*)data & 0xFF00000000000000; // 这样做就错了,这样改变了指针的值data >>= 56;#else#endif /* LITTLE_ENDIAN_SUPPORT */write_data = (U8*)data;......................}
[解决办法]
1 大小端的问题:
对于运行在不同平台的程序,都是需要处理的,可以自己写个函数,判断是大端还是小端,大端的,按大端来处理,小端的,按小端来处理。
2 锁的问题:
锁要锁的是资源,锁的目的,是解决独占资源的争用的问题,不管你定义几个锁,只要有这两个锁之间需要争用独占的资源,有一个锁占锁定了这种独占资源了,另一个锁就需要等待。
3 父子进程的问题,这个是Unix/linux的,这个要根据业务需要来做的。如果可以在父进程处理的,那当然不需要fork子进程了。但是有些东西,父进程处理一些任务,然后交由子进程处理另外的一些任务。这个东西就比较复杂了,建议楼主找相关的书籍看看。有些书,写的还是比较详细的的。
说的很简单,建议楼主找相关的书籍看看,有条件的话,可以自己做几个小程序,实际测试一下。