类的非静态成员函数作为线程函数的注意事项

简介:

代码

#include <string>

#include <boost/thread/thread.hpp>

#include <boost/bind.hpp>

#include <boost/function/function0.hpp>


class CThreadClass

{

public:

CThreadClass()

{

m_stop = true;

}


void StartThread()

{

boost::function0<void> f = boost::bind(&CThreadClass::ThreadFunc, this);

boost::thread thrd(f);

}



void ThreadFunc()

{

std::cout << m_stop << std::endl;

}


private:


bool m_stop;


};


void ThreadTest()

{

CThreadClass helper;

helper.StartThread();

}



int main()

{

ThreadTest();

::Sleep(1000);

return 0;

}


在上面的例子中,在类的构造函数中,初始化m_stop为true,但是在线程函数中访问的时候,m_stop却是为false,并且根据引用,

只有构造函数对m_stop进行了初始化操作


原因

    ThreadTest函数实例化CThreadClass,创建线程,当ThreadTest调用结束的时候,helper实例就会由于生命周期结束,

而在栈中被销毁,这个时候,m_stop的值就是未知的,有的时候如果寄存器中的值没有被清空,或者置位,程序正常运行

上述代码来自于项目中的不成熟的使用方案,通过该方法来创建一个监听服务,切记!!




优雅


#include <boost/thread/thread.hpp>

#include <boost/bind.hpp>

#include <boost/function/function0.hpp>


class CThreadClass

{

public:

CThreadClass()

{

m_stop = false;

}


void StartThread()

{

m_thread.reset(new boost::thread(boost::bind(&CThreadClass::ThreadFunc, this)));

}


void StopThread()

{

m_stop = true;

m_thread->join();

}



void ThreadFunc()

{

while (!m_stop)

{

std::cout << "thread is running" << std::endl;

::Sleep(100);

}

}


private:


bool m_stop;

boost::shared_ptr<boost::thread> m_thread;


};


CThreadClass* pHelper = NULL;


void StartListen()

{

pHelper = new CThreadClass();

pHelper->StartThread();

}


void StopListen()

{

if (NULL == pHelper) return;

delete pHelper;

pHelper = NULL;

}



int main()

{

StartListen();

::Sleep(1000);

StopListen();

return 0;

}


注意:reset前面是.,而join前面是->,目前没有明白





     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1959516,如需转载请自行联系原作者





相关文章
|
1月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
33 0
|
1月前
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
19 1
|
17天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
18天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
23 4
|
20天前
|
Java Spring
springboot单类集中定义线程池
该内容是关于Spring中异步任务的配置和使用步骤。首先,在启动类添加`@EnableAsync`注解开启异步支持。然后,自定义线程池类`EventThreadPool`,设置核心和最大线程数、存活时间等参数。接着,将线程池bean注入到Spring中,如`@Bean(&quot;RewardThreadPool&quot;)`。最后,在需要异步执行的方法上使用`@Async`注解,例如在一个定时任务类中,使用`@Scheduled(cron = &quot;...&quot;)`和`@Async`结合实现异步定时任务。
16 2
|
30天前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
51 2
|
30天前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
71 2
|
1月前
|
安全 C++ 开发者
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
【C++多线程同步】C++多线程同步和互斥的关键:std::mutex和相关类的全面使用教程与深度解析
18 0
|
1月前
|
安全 Java Unix
【C++ 包裹类 std::thread】探索C++11 std::thread:如何使用它来创建、销毁和管理线程
【C++ 包裹类 std::thread】探索C++11 std::thread:如何使用它来创建、销毁和管理线程
44 0
|
1月前
|
存储 安全 Linux
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
36 0
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系