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号。为什么三次输出结果都不一样?换句话说,这三次隐式转换都发生在哪个线程中?
展开
 我来答
炎迪小金2427
2016-07-26 · TA获得超过450个赞
知道小有建树答主
回答量:906
采纳率:0%
帮助的人:206万
展开全部
你好,一般情况下线程的暂停应该是这样的。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多线程编程也会有类似问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式