技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 最近几个容易错的地方总结(hash_map迭代删除,localtime(),线程状态)

最近几个容易错的地方总结(hash_map迭代删除,localtime(),线程状态)

浏览:2860次  出处信息

    一.有关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);

    }

 

建议继续学习:

  1. 腾讯敏捷开发及快速迭代    (阅读:6347)
  2. 循环、迭代、遍历和递归    (阅读:4308)
  3. 进程和线程关系及区别    (阅读:3616)
  4. MySQL为什么要引入Thread Pool的线程处理模式    (阅读:3291)
  5. 实现多线程对队列的读写操作(封装类)    (阅读:2929)
  6. InnoDB线程并发检查机制    (阅读:2522)
  7. C++11(及现代C++风格)和快速迭代式开发    (阅读:2520)
  8. 检查 Linux 下线程库的类型    (阅读:2484)
  9. Perl 的线程中的共享    (阅读:2249)
  10. Perl 的线程中的锁    (阅读:2011)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:一致性hash算法
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1