LINUX.ORG.RU

Помогите с GStaticMutex


0

0

Не получатся использовать GStaticMutex для защиты общего доступа потоками к drawingarea. Из GLib Reference Manual понял, что именно оно мне нужно (Gmutex или GStaticMutex) последний показался проще в использовании, хотя о том как оба они работают доходчивого описания не нашел. Делал, как в примерах в вышеуказанном мануале.

Несколько однотипных потоков пишут в drawingarea однотипные данные, вот часть потока:

static GStaticMutex mutex = G_STATIC_MUTEX_INIT;

printf ("&mutex = %d", &mutex);

g_static_mutex_lock (&mutex);

gdk_draw_pixbuf (
		pixmap,
		gc_map,
		pixbuf,
		0,0,
		data->offset_x,data->offset_y,
		TILESIZE,TILESIZE,
		GDK_RGB_DITHER_NONE, 0, 0);
	
drawingarea11 = lookup_widget(window1, "drawingarea1");

gtk_widget_queue_draw_area (
	drawingarea11, 
	data->offset_x,data->offset_y,
	TILESIZE,TILESIZE);

g_static_mutex_unlock (&mutex);

g_static_mutex_free (&mutex);

Потоки вызываются в цикле

for (i=tile_x0; i<(tile_x0+tiles_nx);i++)

{

for (j=tile_y0; j<(tile_y0+tiles_ny); j++)

{

if (!g_thread_create(&load_trf, thread_data, FALSE, NULL) != 0)

{

g_warning(«can't create DL thread»);

}

}}

Строки if (!g_thread_supported ()) g_thread_init (NULL);

gdk_threads_init ();

gdk_threads_enter ();

в main() имеются.

Помогите плз, кто с этим сталкивался.



Последнее исправление: leha2000 (всего исправлений: 7)

Функции gdk_*, gtk_* можно вызывать, только взяв gdk lock (функции gdk_threads_enter, gdk_threads_leave), т.к. помимо ваших двух нитей есть и другие пользователи gdk.

dmitry_vk ★★★
()

так лучше

static GStaticMutex mutex = G_STATIC_MUTEX_INIT;

printf("&mutex = %d", &mutex);

g_static_mutex_lock(&mutex);

gdk_draw_pixbuf(pixmap, gc_map, pixbuf,
       0, 0, data->offset_x, data->offset_y, TILESIZE, 
       TILESIZE, GDK_RGB_DITHER_NONE, 0, 0);

drawingarea11 = lookup_widget(window1, "drawingarea1");

gtk_widget_queue_draw_area(drawingarea11,
       data->offset_x, data->offset_y, TILESIZE,TILESIZE);

g_static_mutex_unlock(&mutex);

g_static_mutex_free(&mutex);

Потоки вызываются в цикле

for (i = tile_x0; i < (tile_x0 + tiles_nx); i++) {
       for (j = tile_y0; j < (tile_y0 + tiles_ny); j++) {
              if (!g_thread_create(&load_trf, thread_data, FALSE, NULL) != 0) 
                     g_warning("can't create DL thread");
              
       }
}
rg-400
()
Ответ на: комментарий от dmitry_vk

Ведь другие пользователи итак имеют другой pid разве этого недостатончо?

leha2000
() автор топика
Ответ на: комментарий от rg-400

Да так действительно лучше. У меня почемуто так не получилось

leha2000
() автор топика

man thread, man mutex. Только после этого можно man GThread.

PayableOnDeath
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.