gpt4 book ai didi

c++ - 在一个类中创建一个线程并让它在 c++ (cpp) 中的类中的一个函数上执行

转载 作者:太空狗 更新时间:2023-10-29 23:01:01 25 4
gpt4 key购买 nike

我想制作一个有多个线程的程序,线程之间的唯一交互应该是一些仅为线程之间传输而创建的变量。其中之一是队列。我想让一个线程不断地写入一个文件,我希望其他线程不断地给它写行。

但是为了简单起见,我想通过创建类然后简单地从该类调用一个名为 give_line() 的函数来实现这一切。我希望那个正在写入文件的线程是私有(private)的,这样其他人就不会弄乱它。

class bar
{
private:
std::queue<std::string> lines; // The queue
void write() // The function we call from thread
{
std::cout << "Hello world from other thread";
}
public:
bar() // constructor
{
std::thread writer(&bar::write, this); // thread
}
}

int main()
{
bar testing;
std::cout << "Hello World from main thread" << std::endl;

/*
What this does is it allows me to keep the console open till we get a enter key.
*/

std::cin.clear();
std::cin.ignore(32767, '\n');
std::cin.get();


return 0;
}

.

output:
Hello world from other thread

为什么这没有意义以及为什么它不起作用让我很困惑。它启动然后 bam 它崩溃了。我想不通。当我在类里面没有它时,它会起作用,但其他人可能会弄乱线程,我真的不希望那样。除非我需要,否则我不会从项目中给出太多代码。我创建此类以及其他函数和变量的原因是您不需要知道的。

我知道我在某处需要一个 writer.join() 。但那是以后的事。我想让另一个变量能够立即结束一切。该变量只能从主线程访问,因此其他线程不能干扰它。有点像 kill_all 变量。

最佳答案

这里有多个问题,但最重要的是 std::thread 的构造函数需要一个函数来在新启动的线程中执行。看起来您没有传递函数,而是传递了类方法。

我相当确定您的编译器在尝试编译这段代码时对您大喊大叫。仅仅因为您的编译器选择生成某种已编译的目标文件,尽管它报告了错误,但这并不意味着可以忽略编译器诊断。

你可能正在尝试做这样的事情:

static void invoke_write(bar *p)
{
p->write();
}

bar()
{
std::thread writer(&invoke_write, this);
}

现在,您正在调用一个静态函数,并将一个指向实例化类的指针传递给它,它用于调用类方法。

但您崩溃的真正原因是因为您在 bar 的构造函数范围内实例化了 std::thread 的实例。

bar 的构造函数返回时,std::thread 对象,就像任何其他函数/方法范围的对象一样,被销毁,调用其析构函数。但是,您刚刚启动了正在运行的线程,如果在线程仍在运行时调用了 std::thread 的析构函数,则会调用 terminate() , 终止程序。

如果线程正在运行,您必须在销毁 std::thread 实例之前join()。所以,要么是这样的:

bar()
{
std::thread writer(&invoke_write, this);

writer.join();
}

或者,使 std::thread 的实例成为类成员,在构造函数中实例化它,并在析构函数中加入它。像这样的东西:

    bar() : writer(&invoke_write, this)
{
}

~bar()
{
writer.join();
}

private:

std::thread writer;

当然,哪种方法是正确的取决于您的应用程序的要求。

关于c++ - 在一个类中创建一个线程并让它在 c++ (cpp) 中的类中的一个函数上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com