mutil_thread附加字符串原因核心

发布于 2025-02-05 08:08:08 字数 2059 浏览 1 评论 0原文

我使用多线程更新全局向量的每个项目(字符串) 每个线程更新项目(字符串)带有不同的索引 我认为是避免更新相同数据的好方法 但是我仍然得到核心,我不知道为什么

extern vector<string> gTestVec;
#define NUM 10

void * worker(void * args) {
  thread_data * p = (thread_data *)args;
  int i = p->thread_id;

  for (int j=0; j<100; j++) {
    gTestVec[i] += "a";
  }

  return NULL;
}


void do_complete_stage_test::excute() {
  int i = 0;
  pthread_t thd[NUM];
  thread_data data[NUM];

  for (i=0; i<NUM; i++) {
    gTestVec.push_back(format("%d", i));
    data[i].thread_id = i;
    
    if (0 != pthread_create(&(thd[i]), NULL, &worker, (void *)&data[i])) {
      printf("pthread_create failed");
    }
  }

  for (int i=0; i<NUM; i++) {
    if (0 != pthread_join(thd[i], NULL)) {
      printf("pthread_join failed");
    }
  }
}

在运行代码时,有时会得到Coredump

Starting program: /data/settle_script/isp_tran_collect/bin/isp_tran_collect -p 2134234
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff2623700 (LWP 6316)]
[New Thread 0x7fffefb0e700 (LWP 6317)]
[New Thread 0x7fffef30d700 (LWP 6318)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffef30d700 (LWP 6318)]
0x00007ffff6787d67 in ?? () from /lib64/libstdc++.so.6
(gdb) bt
#0  0x00007ffff6787d67 in ?? () from /lib64/libstdc++.so.6
#1  0x00007ffff678899b in std::string::reserve(unsigned long) () from /lib64/libstdc++.so.6
#2  0x00007ffff6788bbf in std::string::append(char const*, unsigned long) () from /lib64/libstdc++.so.6
#3  0x000000000044babe in append (__s=0x880492 "a", this=<optimized out>) at /usr/include/c++/4.8.2/bits/basic_string.h:1009
#4  operator+= (__s=0x880492 "a", this=<optimized out>) at /usr/include/c++/4.8.2/bits/basic_string.h:942
#5  worker (args=<optimized out>) at ../src/do_complete_stage_test.cpp:21
#6  0x00007ffff7bc6e25 in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff5ee635d in clone () from /lib64/libc.so.6

感谢您的帮助!!!

i use multi thread to update each item(string) of global vector
each thread update item(string) with different index
i think is a good way to avoid updating same data
but i still get core, i do not know why

extern vector<string> gTestVec;
#define NUM 10

void * worker(void * args) {
  thread_data * p = (thread_data *)args;
  int i = p->thread_id;

  for (int j=0; j<100; j++) {
    gTestVec[i] += "a";
  }

  return NULL;
}


void do_complete_stage_test::excute() {
  int i = 0;
  pthread_t thd[NUM];
  thread_data data[NUM];

  for (i=0; i<NUM; i++) {
    gTestVec.push_back(format("%d", i));
    data[i].thread_id = i;
    
    if (0 != pthread_create(&(thd[i]), NULL, &worker, (void *)&data[i])) {
      printf("pthread_create failed");
    }
  }

  for (int i=0; i<NUM; i++) {
    if (0 != pthread_join(thd[i], NULL)) {
      printf("pthread_join failed");
    }
  }
}

when i run the code,sometimes get coredump

Starting program: /data/settle_script/isp_tran_collect/bin/isp_tran_collect -p 2134234
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff2623700 (LWP 6316)]
[New Thread 0x7fffefb0e700 (LWP 6317)]
[New Thread 0x7fffef30d700 (LWP 6318)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffef30d700 (LWP 6318)]
0x00007ffff6787d67 in ?? () from /lib64/libstdc++.so.6
(gdb) bt
#0  0x00007ffff6787d67 in ?? () from /lib64/libstdc++.so.6
#1  0x00007ffff678899b in std::string::reserve(unsigned long) () from /lib64/libstdc++.so.6
#2  0x00007ffff6788bbf in std::string::append(char const*, unsigned long) () from /lib64/libstdc++.so.6
#3  0x000000000044babe in append (__s=0x880492 "a", this=<optimized out>) at /usr/include/c++/4.8.2/bits/basic_string.h:1009
#4  operator+= (__s=0x880492 "a", this=<optimized out>) at /usr/include/c++/4.8.2/bits/basic_string.h:942
#5  worker (args=<optimized out>) at ../src/do_complete_stage_test.cpp:21
#6  0x00007ffff7bc6e25 in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff5ee635d in clone () from /lib64/libc.so.6

thanks for your help!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤芳又自赏 2025-02-12 08:08:13

在启动一些线程后,您可能会更改vector的容量。

防止向量重新分配和移动其内容的最简单方法是在启动第一个工作线程之前保留空间。

因此,请

gTestVec.reserve(NUM);

在循环前打电话。

You are potentially changing the capacity of the vector after you already started some threads.

The easiest way to prevent the vector from re-allocating and moving its contents is to reserve the amount of space before you start the first worker thread.

So call

gTestVec.reserve(NUM);

Before your loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文