Почему строковую переменную печатают с мусором

Я написал следующую простую программу, чтобы понять темы. В результате появляются некоторые символы мусора - почему эти символы появляются? Я использую компилятор GNU G++ в Fedora 17.

#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 ответа

Вы должны убедиться, что все потоки работают до men_list выходит из области видимости и память восстанавливается.

Это не то что pthread_exit делает - скорее это завершает вызывающий поток.

pthread_exit(NULL) в конце вашего main() не делает ничего разумного. Хотя на странице руководства сказано, что выход из основной функции pthread_exit будет "позволять другим потокам запускаться до завершения" (как вы упоминаете в комментариях), это не означает, что область действия основной функции не закончится, когда функция завершит работу, а также не означает, что другие потоки бежать до завершения, прежде чем 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;
}

Также я вижу проблему синхронизации. Вам необходимо синхронизировать общий ресурс всякий раз, когда вы используете потоки. Здесь общим ресурсом является std::cout. одним способом можно поместить код печати под какой-либо объект синхронизации. тогда у вас будет все напечатано по порядку.

Другие вопросы по тегам