windows下多线程知识

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值