LINUX.ORG.RU

Подскажите по поводу g_cond_wait


0

0

main.c :

...
	thread.mutex = g_mutex_new();
	thread.cond = g_cond_new();
	thread.main_thread = g_thread_create(main_thread,main_window,TRUE,NULL);
	thread.stream = NULL;
	g_mutex_lock(thread.mutex);
	thread.status = STATUS_INIT;	
	g_cond_signal(thread.cond);
	g_mutex_unlock(thread.mutex);
...

а в ните созданой в main.c такой код:

...
	while(1){
		g_mutex_lock(thread.mutex);
		g_print("enter to loop thread...\n");
		g_cond_wait(thread.cond,thread.mutex);
		if(thread.status == STATUS_INIT){
			g_print("enter to init...\n");
...

Так вот фраза "enter to loop thread..." пишется а "enter to init..." 
нифига, отсуда следует что g_cond_wait подвисла и не хочет 
воспринимать сигнал, посланый ф-ией g_cond_signal :(

Как побороть трабл? 
anonymous

я думаю что g_cond не более чем обертка для
pthread_cond
из pthread_cond(3)
pthread_cond_signal restarts one of the threads that are waiting on the
condition variable cond. If no threads are waiting on cond, nothing
happens. If several threads are waiting on cond, exactly one is
restarted, but it is not specified which.

так что если ты сначала пошлешь сигнал, а потом запустишь thread ничего не произойдет, кто-то должен уже жадть сигнал, до того как ты его пошлешь,

а почему в данном коде нельзя воспользоваться mutex, для чего здесь нужны сигналы?


anonymous
()
Ответ на: комментарий от anonymous

> а почему в данном коде нельзя воспользоваться mutex, для чего здесь нужны сигналы?

Ну например нажал на кнопку - отослал сингал и дальше от окошка сигналы принимаешь не лочишь GUI

anonymous
()
Ответ на: комментарий от anonymous

А я понял! Главная нить в main.c быстрее лочит мютекс и сигнал посылается в никуда :(

Если после g_thread_create поставить sleep(1) например то все работает!

Как побороть данную проблему? Как добиться что бы нить успела быстрее залочить мютекс чем основная программа?

anonymous
()
Ответ на: комментарий от anonymous

синхронизироватся.
попробуй ввести ещё одно состояние нитки типа: STATUS_CAN_SIGNAL

...
    thread.mutex = g_mutex_new();
    thread.cond = g_cond_new();
    thread.status = STATUS_UNKNOWN;
    thread.main_thread = g_thread_create(main_thread,main_window,TRUE,NULL);
    thread.stream = NULL;
    g_mutex_lock(thread.mutex);
    while (STATUS_UNKNOWN == thread.status)
        g_cond_wait(thread.cond,thread.mutex);
    thread.status = STATUS_INIT;
    g_cond_signal(thread.cond);
    g_mutex_unlock(thread.mutex);
...

...
    while(1){
        g_mutex_lock(thread.mutex);
        if (STATUS_UNKNOWN == thread.status) {
            thread.status = STATUS_CAN_SIGNAL;
            g_cond_signal(thread.cond);
        }
        g_print("enter to loop thread...\n");
        g_cond_wait(thread.cond,thread.mutex);
        if(thread.status == STATUS_INIT){
        g_print("enter to init...\n");
...

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