最后更新于 .

一.有关hash_map的使用
map中可以用 map.erase(it++)或者it = map.erase(it);来实现迭代删除
但是在hash_map中

iterator erase(iterator it);

这个函数声明和定义是不存在的
取而代之的是

void erase(iterator it);

但它本身也没有实现迭代删除
如果要迭代删除的话 还是要用 erase(it++)

二.localtime()的误用
localtime的函数声明如下:

struct tm *localtime(const time_t *timep);

而localtime的内部实现是一个static变量,所以,如果你这样调用:

time_t t1=time(NULL);
struct tm *p1=localtime(&t1);
sleep(10);
time_t t2=time(NULL);
struct tm *p2=localtime(&t2);

将会造成p1和p2的值相等……
解决方法就是:

time_t t1=time(NULL);
struct tm tm1;
localtime_r(&t1,&tm1);
sleep(10);
time_t t2=time(NULL);
struct tm tm2;
localtime_r(&t2,&tm2);

localtime_r的定义如下:

struct tm *localtime_r(const time_t *timep, struct tm *result);

三.检测线程是否存在
检测进程是否存在是很简单的,但是很少会有需求检测线程是否存在,但是实际上也会遇到这种情况。
解决方法很简单,就是对线程发送一个无关紧要的信号,查看返回值即可,代码如下:

pthread_kill_err = pthread_kill(threadid,0);
if(pthread_kill_err == ESRCH)
{
    ERROR_LOG(“ID为0x%x的线程不存在或者已经退出。\n”,(unsigned int)threadid);
}
else if(pthread_kill_err == EINVAL)
{
    ERROR_LOG(“发送信号非法。\n”);
}
else
{
    ERROR_LOG(“ID为0x%x的线程目前仍然存活。\n”,(unsigned int)threadid);
}

 

 

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

暂无评论

发表评论