IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Vimer 2009-11-20 21:05:28 累计浏览 4,176 次
本机暂存

    一.有关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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,448)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,412)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,259)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,499)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,445)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,876)
  7. 浅析C++多线程内存模型 (累计阅读 8,802)
  8. C++ 多线程编程总结 (累计阅读 8,097)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,208)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,580)