【发布时间】:2019-09-05 14:30:42
【问题描述】:
使用 Glib,我创建了两个 GSource 并注册了相同的回调函数。
并且,将不同的数据指针传递给每个 GSource。
代码如下...
gboolean cb (gpointer data)
{
printf("data is %d \n", GPOINTER_TO_INT(data));
}
void init_g_source (void)
{
GSource* src1 = g_timeout_source_new (1000);
g_source_set_callback (src1, cb, GINT_TO_POINTER(9), NULL);
g_source_attach (src1, g_main_loop_get_context(mainloop));
g_source_unref (src1);
GIOChannel *ch = g_io_channel_unix_new (socket_fd);
GSource* src2 = g_io_create_watch (ch, G_IO_IN);
g_source_set_callback (src2, cb, GINT_TO_POINTER(7), NULL);
g_source_attach (src2, g_main_loop_get_context(mainloop));
g_source_unref (src2);
}
预期结果
- src1 回调时:数据为 9
- src2 回调时:数据为 7
但是,实际结果
- src1 回调时:数据为 9
- src2回调时:数据为6811792
为什么错误的数据指针只在src2中使用socket_fd?
传递了一个指向局部或全局变量的指针 : 结果是一样的。
传递了一个指向内存分配的指针(g_malloc 或 g_new) : 结果是一样的。
传递了一个 NULL 指针 : 只是数值不同,结果是一样的。
【问题讨论】:
-
你试过
int data = 9; g_source_set_callback (src1, cb, &data, NULL);吗? -
传递了一个指向局部或全局变量的指针,但结果是一样的。