作者skyHuan (是该换 了吧)
看板C_and_CPP
标题[问题] class member function中使用std::thread
时间Wed Jun 9 05:58:25 2021
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
std::thread
问题(Question):
最近在实作multithread的时候遇到了一些问题
以下是程式码,main function呼叫的函式会呼叫两条thread帮忙做两个加法运算
https://pastebin.com/GHn0WWmP
执行output结果是预期的37或73没有问题
但当如果要呼叫thread的函式是class member function的时候就会compiler error
https://pastebin.com/E5vxyxXW
以下是我自己环境(GCC 4.8.5)的报错
https://pastebin.com/nNem1nAv
我用线上编译器onlinegdb.com试的error如下:
error: invalid use of non-static member function ‘void ATPG::test(int, int)’
稍微google一下有找到这篇类似问题的解法
https://thispointer.com/c11-start-thread-by-member-function-with-arguments/
但这篇的使用情境是在main function中开一条thread呼叫class member function
我的使用情境是class member function开thread呼叫其他class member function
用上述网站的解法一样会有很多error
想请问前辈们这种使用情境下该怎麽呼叫thread比较正确
还是这其实是错误的使用方式,应该要在main function中开thread比较正确呢?
抱歉比较少multithread的coding经验,麻烦前辈们赐教了,谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.129.130.157 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1623189517.A.821.html
1F:→ Lipraxde: 用你查到的那篇的方法啊,是有什麽 error?06/09 06:48
2F:→ chengcti: class member 前面加上 static06/09 09:09
3F:→ chengcti: class 还没建立 传进去可能会变成存取不存在的记忆体 06/09 09:10
4F:→ chengcti: 所以一定要是class06/09 09:10
5F:→ chengcti: static member06/09 09:10
感谢两位,仔细检查後用那篇的方法重新再写了一次没有thread相关的error了
也谢谢c大的解释,对为何要这样用的原因也有比较了解了
--
但我在把要用thread呼叫的function改成static member之後又会遇到两个问题
附上稍微复杂一点的code:
https://pastebin.com/3pJVVmV4
1. 呼叫的function还有呼叫其他function(第32行),就会出现以下error
error: cannot call member function ‘void ATPG::tdf_pfFsim_all_fault(int,
int, int)’ without object
2. 呼叫的function如果有用到class data member(第29,30行)也会出现error
error: invalid use of member ‘ATPG::_piPattern’ in static member function
3. 如果class data member有在constructor初始化(第7行)也会出现error
error: ‘int ATPG::_faultCount’ is a static data member; it can only be
initialized at its definition
1.的部分把32行呼叫的function也改宣告成static可以解掉error
但这个function也会呼叫其他member function,要全部都宣告成static才不会有error
请问这是正确的解决方式吗?还是有更好的解法
2.3.的部分我也是把data member改成static
但如果有在constructor初始化遇到的error我就不会解决了QQ
不知道有没有更合适的解决方式,谢谢!
※ 编辑: skyHuan (220.129.130.157 台湾), 06/09/2021 12:42:57
==
6F:推 flarehunter: Google "c++ std::thread class method" 第一篇06/09 12:07
7F:→ flarehunter: shorturl.at/frstM06/09 12:10
https://stackoverflow.com/questions/10998780/stdthread-calling-method-of-class
这篇的方法可以解决!也不会有上面static function的後续问题
感觉是比较适合的作法,感谢f大
==
8F:→ Lipraxde: 你是第一次写 C++?06/09 13:45
9F:→ Lipraxde: 错误讯息都有,文章里也有介绍,花点时间看不好吗?06/09 13:46
10F:→ sarafciel: 你原本那篇文章是有你要的解的 这边你要自己学会变通 06/09 13:58
C++确实没有到非常熟,thread也是第一次使用
有试着自己搜寻跟除错了,也有先理解并简化问题才上来发问
可能因为比较赶还没真的花很多时间仔细研究就上来发问
下次会自己多花时间多注意的,谢谢两位前辈指教
※ 编辑: skyHuan (223.137.86.106 台湾), 06/09/2021 16:37:08
11F:→ Lipraxde: 其实你一开始就有找到答案了,比较熟 C++ 後可以再回来 06/09 22:00
12F:→ Lipraxde: 看看最初的盲点,加油吧~ 06/09 22:00