c++11多线程 隐式转换到底发生在哪个线程中?请看问题补充
voidfun3(std::string&str)//线程函数{}voidPrintThisThredID()//打印当前线程id号{CStringcs;cs.Forma...
void fun3(std::string &str)//线程函数
{
}
void PrintThisThredID()//打印当前线程id号
{
CString cs;
cs.Format(_T("%d\n"), std::this_thread::get_id());
OutputDebugString(cs);
}
class AA
{
public:
AA(std::string str) :m_str(str){};
operator std::string&()//隐式转换
{
PrintThisThredID();
return m_str;
}
private:
std::string m_str;
};
void Ctest_stdthread1Dlg::OnBnClickedButton2()
{
PrintThisThredID();
AA a("abc");
std::thread t(fun3,std::ref(a));//启动线程
t.join();//等待线程
std::string s = a;
}
输出结果:
212
292
线程 0xbb0 已退出,返回值为 0 (0x0)。
280
如果注释掉启动线程以及等待线程的2句代码,那么输出为:
212
212
问题:如果启动线程,那么按钮响应函数先输出当前线程号,然后执行了2次类AA实例a的隐式转换,每次转换都输出当前线程id号。为什么三次输出结果都不一样?换句话说,这三次隐式转换都发生在哪个线程中? 展开
{
}
void PrintThisThredID()//打印当前线程id号
{
CString cs;
cs.Format(_T("%d\n"), std::this_thread::get_id());
OutputDebugString(cs);
}
class AA
{
public:
AA(std::string str) :m_str(str){};
operator std::string&()//隐式转换
{
PrintThisThredID();
return m_str;
}
private:
std::string m_str;
};
void Ctest_stdthread1Dlg::OnBnClickedButton2()
{
PrintThisThredID();
AA a("abc");
std::thread t(fun3,std::ref(a));//启动线程
t.join();//等待线程
std::string s = a;
}
输出结果:
212
292
线程 0xbb0 已退出,返回值为 0 (0x0)。
280
如果注释掉启动线程以及等待线程的2句代码,那么输出为:
212
212
问题:如果启动线程,那么按钮响应函数先输出当前线程号,然后执行了2次类AA实例a的隐式转换,每次转换都输出当前线程id号。为什么三次输出结果都不一样?换句话说,这三次隐式转换都发生在哪个线程中? 展开
1个回答
展开全部
你好,一般情况下线程的暂停应该是这样的。1.创建线程hThread=CreateThread()2.增加事件。HANDLE hEvent = CreateEvent()参数作用请参见MSDN3.在线程函数中使用WaitForSingleObject(hEvent , INFINITE );设置暂停开关, 如在线程函数中有如下结构: while(true) { WaitForSingleObject(hEvent , INFINITE ); }4.然后在需要控制线程运行的地方通过调用SetEvent(hEvent)和ResetEvent(hEvent)设置事件信号状态来控制线程运行或暂停。 5.关闭线程和事件。
追问
谢谢你的回答。你说的是windows多线程编程的用法。其实我想问的是上述代码中的隐式转换发生在哪个线程中,即使不使用c++11多线程而使用windows多线程编程也会有类似问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询