Почему строковую переменную печатают с мусором
Я написал следующую простую программу, чтобы понять темы. В результате появляются некоторые символы мусора - почему эти символы появляются? Я использую компилятор 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. одним способом можно поместить код печати под какой-либо объект синхронизации. тогда у вас будет все напечатано по порядку.