我编写了以下简单程序来理解线程。在结果中有一些垃圾字符 - 为什么这些字符出现?我在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:
答案 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。一种方法可以将打印代码放在某个同步对象下。那么你将按顺序打印所有内容。