gpt4 book ai didi

C++ Gtk 线程。我做对了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:37 25 4
gpt4 key购买 nike

我有一个 gtkmm 应用程序,我试图将一些长时间运行的任务放入单独的线程中,这样它们就不会锁定 GUI。这是我的设计所依据的教程:

http://www.velvetcache.org/2008/09/30/gtkmmglibmm-thread-example

我使用 Glib::Dispatcher 信号在工作完成或需要更新某些内容时通知 GUI 线程,但是我不确定如何在工作线程和 GUI 线程之间传递数据。到目前为止,我一直在将指向创建 worker 的类的指针传递给 worker ,然后修改类(class)的公共(public)成员,但有些事情告诉我这样做不是最正确的。这是一个例子:

class Some_GUI_class
{
public:
std::string thread_message;

private:
Worker_class* worker;

void start_worker()
{
if (worker != NULL) return;

worker = new Worker_class(this);
worker->sig_message.connect(sigc::mem_fun(*this, &Some_GUI_class::display_message_from_thread);
worker.start();
}

void display_message_from_thread()
{
some_label->set_text(thread_message);
}
}

class Worker_class
{
public:
Worker_class(Some_GUI_class* gui_class) : gui_class(gui_class)
{}

void start()
{
thread = Glib::Thread::create(sigc::mem_fun(*this, &Worker_class::run), true);
}

Glib::Dispather sig_message;

protected:
Glib::Thread* thread;
Glib::Mutex mutex;

Some_GUI_class* gui_class;

void run()
{
// ...
gui_class->thread_message = "Message from a thread!";
sig_message();
}

}

这基本可行,但我想如果 GUI 线程想同时修改 thread_message 会有问题吗?这样做是否安全,只要我确定变量仅由单个线程修改,还是有更好的方法?

最佳答案

您有竞争条件。即使您的 gui 线程不修改 thread_message,允许 GUI 线程读取它而另一个线程正在修改它也不会给您带来长期的快乐。这是因为 std::string 本身并没有受到多个线程访问它的保护,并且有多个内部字段。如果一个线程正在修改其内部字段之一,而另一个线程正在读取它们,则从第二个线程的角度来看,内部状态将不一致。

您可以在 GUI 类中使用互斥锁来保护对可能被另一个线程访问的变量的访问。在 get/set 例程中锁定和解锁互斥锁,并将这些例程用于所有其他访问,以确保一次只有一个线程可以访问或修改变量。

关于C++ Gtk 线程。我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10336192/

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