使用c ++删除发送到FLTK中线程的数据

Posted

技术标签:

【中文标题】使用c ++删除发送到FLTK中线程的数据【英文标题】:deleting data sent to thread in FLTK using c++ 【发布时间】:2014-06-02 13:44:10 【问题描述】:

我正在执行一个长任务,在某个函数中实现,在 FLTK(C++ 中)的一个新线程(即不是主 GUI 线程)中。

我通过一个回调函数来实现这一点,该函数反过来创建线程,这样我就有了某种形式

void callback(Fl_Widget* widget,void* passed_data)

data_type* data = new data_type;

data->value = x; //populate data structure to send to function

fl_create_thread(thread1,function,data);


其中 fl_create_thread(至少对我而言)只是使用 pthread_create 意味着数据变量作为 void 指针传递,因此“函数”也采用 void 指针。

我意识到这实际上会造成内存泄漏,因为我不删除“数据”: 我无法在 fl_create_thread 行之后删除它,因为线程不一定(或曾经)完成运行。我曾尝试删除“函数”末尾的指针,但这会引发两个问题

1) 删除 void 指针是未定义的,因此我收到了警告。

2) 这几乎违背了使用函数的意义:有更好的通用编码实践吗?

谁能告诉我应该如何处理这个问题?谢谢。

【问题讨论】:

【参考方案1】:

1) 删除 void 指针是未定义的,所以我收到警告 达到这个效果。

您可能在函数的一开始就转换为正确的类型(或者您应该为了有意义地使用参数)。删除该指针而不是 void * 参数,您将不会收到警告。

2) 这几乎违背了使用函数的意义:是否存在 更好的通用编码实践?

不确定我明白你的意思。这个线程接口 (pthread) 非常类似于 c,因此它必须求助于 void 指针才能传递任意数据。您可以查看C++ thread interface 以获得更多的 C++ 方式来定义要执行的内容以及使用哪些参数

对于内存,您应该始终清楚分配内存的所有权。这种方法将所有权转移给刚刚创建的线程。

【讨论】:

你说得对,我正在转换为我需要的数据类型。澄清一下,在“函数”中执行(其中数据是在原始问题中传递函数的 void_ptr)是否安全且正确(避免内存泄漏) data_type* ptr = (data_type*) data;删除指针;除此之外,我想我的意思是能够编写一个函数会很好,这样它就可以不知道它是通过引用传递还是通过在堆上或线程中使用变量等来调用的.(即不用担心自身内部的内存泄漏可能性)。可以查看std::thread。谢谢。

以上是关于使用c ++删除发送到FLTK中线程的数据的主要内容,如果未能解决你的问题,请参考以下文章

Post无法将数据发送到php文件[php新手]

无法在后台服务中将数据发送到Firebase

在 UI 线程中删除已发送的消息

我正在使用列表视图活动将数据发送到编辑数据活动,这里有什么问题?

如何从发送到 Cloudwatch 的指标中删除子节点名称?

如何使用 angularjs $http.delete() 请求发送数据?