1、线程终结
终结线程的几个方法:
1.等待线程函数运行完成自动结束
2.ExitThread(),用于结束线程自身
3.TerminateThread(),所有线程都可以用该方法结束
4.父进程关闭,子线程随之关闭
只建议使用第一种方法结束线程,其它的方式都对应有缺陷
下面给出几个结束过程中发生事情:
1.资源有序释放(如操作系统分配资源,用到的C++类析构),返回线程退出代码,线程内核对象使用计数-1;
2.操作系统相关资源释放;但象C++类并未析构,造成内存泄露;这里如果用_beginthreadex建立线程,而用ExitThread或者_endthread来释放线程,则线程放在堆上的线程数据块_tiddata也未释放,内存泄露;
3.该函数为异步函数,即通知操作系统终结线程后立即返回,而不管系统是否已经真的结束了线程。同时线程栈也不会释放
4.用ExitProgerss, TerminateProcess函数关闭进程后,进程会调用TerminateThread来关闭线程,效果如3,线程的栈没有释放,申请的对象资源也没释放.
子线程结束的方法:
1.最好不要用_endthread()和TerminateThread结束线程。应该让线程函数自己返回结束。
2.或者用事件或者变量或消息等手段通知线程函数结束。线程函数中应该包含处理这些退出信息的代码。
2、子线程向主线程发消息
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
static char g_msg_buf[256];
void* thread_entry(void* arg)
{
static int i = 0;
while (1)
{
i++;
sleep(1);
pthread_mutex_lock(&mutex);
sprintf(g_msg_buf, "message %d", i);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main(void)
{
pthread_t tid;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&tid, NULL, thread_entry, NULL);
while (1)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("msg : %s\n", g_msg_buf);
pthread_mutex_unlock(&mutex);
}
pthread_join(tid, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
参考网址:http://blog.csdn.net/flyingleo1981/article/details/52788150
参考网址:http://bbs.csdn.net/wap/topics/390513414
参考网址:http://bbs.csdn.net/topics/391545230?page=1
参考网址:https://stackoverflow.com/questions/4577961/pthread-synchronized-blocking-queue
参考网址:http://www.cnblogs.com/lijingcheng/p/4454876.html