为什么用垃圾字符串变量打印

时间:2014-01-07 06:49:29

标签: c++ string pthreads gnu

我编写了以下简单程序来理解线程。在结果中有一些垃圾字符 - 为什么这些字符出现?我在Fedora 17中使用GNU G ++编译器。

#include <iostream>
#include <string.h>

#define THREAD_COUNT 5

struct Man
{
 char name[10];
 int age;
 std::string address;
};


void* ThreadTask(void* man)
{
 Man *my_man = (Man*)man;
 std::cout << "Address of the person: " << my_man->address << std::endl;
}


int main()
{
 pthread_t threads[THREAD_COUNT];
 Man men_list[THREAD_COUNT];

 for(int i=0; i<THREAD_COUNT; i++)
 {
  strcpy(men_list[i].name,"nayana");
  men_list[i].age = i;
  men_list[i].address = "Singapore";

  int rc = pthread_create(&threads[i],NULL,ThreadTask,(void*)&men_list[i]);
  if(rc)
  {
  std::cout << "Error while creating the thread" << std::endl;
  }
 }

pthread_exit(NULL);
return 0;
}

结果:

Address of the person: Singapore�0+���*��!      ����Singapore�0��▒s�!��t��s���E��t��s���EI
                                                                                          Address of the person: Singapore�0;s��:s�!�w       ����Singapore�0+���*��! ����Singapore�0��▒s�!��t��s���E��t��s���EI


                                       Address of the person: Address of the person:

2 个答案:

答案 0 :(得分:4)

您需要确保在men_list超出范围并且回收内存之前运行所有线程。

这不是pthread_exit所做的 - 而是终止调用线程。

pthread_exit(NULL)末尾的main()并未完成任何合理的事情。尽管man页面说使用pthread_exit退出main函数将“允许其他线程运行完成”(正如你在注释中所引用的),这并不意味着主函数的范围赢了在函数执行时结束,也不意味着在 pthread_exit返回之前其他线程将运行完成

您可以使用pthread_join等待线程运行完成。要等待所有线程运行完成,您可以使用以下内容:

int main()
{
  pthread_t threads[THREAD_COUNT];
  Man men_list[THREAD_COUNT];

  for(int i=0; i<THREAD_COUNT; i++)
  {
    strcpy(men_list[i].name,"nayana");
    men_list[i].age = i;
    men_list[i].address = "Singapore";

    int rc = pthread_create(&threads[i],NULL,ThreadTask,(void*)&men_list[i]);
    if(rc)
    {
      std::cout << "Error while creating the thread" << std::endl;
    }
  }

  for(int i=0; i < THREAD_COUNT; i++)
  {
    pthread_join( threads[i], NULL );
  }

  return 0;
}

答案 1 :(得分:0)

我也看到了同步问题。无论何时使用线程,都需要同步公共资源。这里常见的资源是std :: cout。一种方法可以将打印代码放在某个同步对象下。那么你将按顺序打印所有内容。