线程问题,其中1个线程工作,但导致调用方法不返回 我目前正在学习C++,我对线程有一个奇怪的问题。我在Java和C中做了很多线程化的工作,没有遇到任何问题。我现在试图复制一个C语言库,我在C++中有一个库和一个测试应用程序。p>
在main.cpp中,我创建了一个线程问题,其中1个线程工作,但导致调用方法不返回 我目前正在学习C++,我对线程有一个奇怪的问题。我在Java和C中做了很多线程化的工作,没有遇到任何问题。我现在试图复制一个C语言库,我在C++中有一个库和一个测试应用程序。p>,c++,multithreading,C++,Multithreading,在main.cpp中,我创建了一个InitialiseLibrary类的实例,并调用方法initialise。这会进行配置加载,然后启动一个线程,该线程在应用程序运行期间保持运行。我希望这个线程启动,然后我的initialise函数返回true,然后我继续,并创建一个测试类的实例,该实例每1秒写入一个日志文件 下面是main.cpp InitialiseLibrary initLibrary("config.ini"); if (!initLibrary.initialise(1
InitialiseLibrary
类的实例,并调用方法initialise
。这会进行配置加载,然后启动一个线程,该线程在应用程序运行期间保持运行。我希望这个线程启动,然后我的initialise函数返回true,然后我继续,并创建一个测试类的实例,该实例每1秒写入一个日志文件
下面是main.cpp
InitialiseLibrary initLibrary("config.ini");
if (!initLibrary.initialise(1))
{
cout << "Failed to initialise library" << endl;
return EXIT_FAILURE;
}
TestClass testClass;
testClass.writeSomeLogsInThread();
cout << "The library config log file is: " << GlobalConfig::GeneralConfig::logFile << endl;
InitialiseLibrary initLibrary(“config.ini”);
如果(!initLibrary.initialise(1))
{
cout“线程有一个奇怪的问题”-欢迎来到线程世界
我认为您误解了所创建线程的堆栈,以及它将如何与主线程交互。所创建线程的堆栈从您告诉它开始的函数开始-当该函数完成时,线程死亡(这将允许您的join()停止阻塞)
关于线程之间的通信,我认为您应该了解互斥、条件和信号量。“线程有一个奇怪的问题”-欢迎来到线程世界
我认为您误解了所创建线程的堆栈,以及它将如何与主线程交互。所创建线程的堆栈从您告诉它开始的函数开始-当该函数完成时,线程死亡(这将允许您的join()停止阻塞)
关于线程之间的通信,我认为您应该了解互斥、条件和信号量。您的主线程在这一行阻塞,等待logRotationThread结束
logRotationThread.join();
您的主线程应该在生成另一个线程后继续执行它需要执行的任何工作,然后只有当它没有什么事情可做时,才应该加入日志旋转线程。您的主线程在这一行阻塞,等待日志旋转线程结束
logRotationThread.join();
主线程应该在生成另一个线程后去做它需要做的任何工作,然后只有当它无事可做时才会加入日志旋转线程。join
等待一个线程完成执行,因此当你加入时,startogrotation
才会返回,直到发生这种情况
此外,作用域和生存期的常规规则适用于线程对象-logRotationThread
将在startologrotation
返回时销毁。
如果线程在销毁时是“可连接的”,那么这是一个错误
最简单的解决方案可能是在InitialiseLibrary
中有一个LogRotation
成员,在LogRotation
中有一个thread
成员
然后,您可以加入LogRotation
的析构函数中的线程。加入
等待线程完成执行,因此当您加入时,startLogRotation
将不会返回,直到发生这种情况
此外,作用域和生存期的常规规则适用于线程对象-logRotationThread
将在startologrotation
返回时销毁。
如果线程在销毁时是“可连接的”,那么这是一个错误
最简单的解决方案可能是在InitialiseLibrary
中有一个LogRotation
成员,在LogRotation
中有一个thread
成员
然后你可以加入LogRotation
的析构函数中的线程。据我所知
logRotationThread是一个长时间运行的线程(它在整个应用程序期间运行)。主线程不需要在logRotationThread上等待(加入)
对于初学者,请从我所知道的内容中删除logRotationThread.join()
logRotationThread是一个长时间运行的线程(它在整个应用程序期间运行)。主线程不需要在logRotationThread上等待(加入)
对于初学者来说,删除logRotationThread.join()
Hmm,这是如何工作的,因为线程在库中启动,有两个方法,main无法访问thread变量,要调用join,如何初始化函数(启动日志旋转线程)知道main什么时候将完成连接,什么时候可以连接线程,什么时候不能连接线程,这是您必须弄清楚的。库可以将LogRotation对象保留为私有成员,并添加一个closedown()
排序方法来执行join()你的代码的结构看起来并不是很习惯的C++。听起来我必须跟踪它创建的所有线程,然后在程序结束之前加入它们。也许我对C语言的思考太多了,你在其中创建了一个线程,应用程序总是等到所有线程完成后才退出。在C++中使用java或者C语言,你可以知道它是什么样的。它是根本不同的。HMM,它是如何工作的,因为线程是从一个库中启动的,一对方法是深的,所以main不能访问线程变量,要调用连接,我的初始化函数(它启动日志旋转线程)是怎样的?知道main什么时候将完成连接,什么时候可以连接线程,什么时候不能连接线程,这是您必须弄清楚的。库可以将LogRotation对象保留为私有成员,并添加一个closedown()
排序方法来执行join()你的代码结构看起来并不是很习惯的C++,听起来我必须保持跟踪。
logRotationThread.join();