Страниц: [1]
  Печать  
Автор Тема: Сознаю себя полным неучем. Пропадаю- проблемы с ждущими болкировакми(+)  (Прочитано 2671 раз)
gosha
Участник
*
Offline Offline

Сообщений: 43


Просмотр профиля
« : Сентября 20, 2004, 04:57:48 pm »

Использую ждущие блокировки  стандартно, но адрес передаю как параметр ф-ии.
При таком использовании, ждущие блокировки не работают. Подскажите пожалуйста где туплю/собака порылась. Спасибо.

char   volatile go_flg, continue_flg;
struct run_cmd_t
   {char volatile * flg;
    char _cmd[128];
   };
/*==============================================================================*/
int run_cmd(...., char volatile * flg)
{long rc;
 char s[512];
{pthread_sleepon_lock();
 while ( !(*flg) )  {sprintf(s,"%s on addr=%p", _sleep_on_wait_msg, flg);msg_to_log(s);pthread_sleepon_wait(flg);}
 pthread_sleepon_unlock();

 ....
 return EOK;
}
int  export_cmd (struct run_cmd_t *_cmd)
{struct plc_ascii_cmd_qry qry;
 struct ea_errcode_rep rep;
 int rc;
 
 qry.type= PLC_ASCII_CMD;
 strncpy(qry.cmd, _cmd->_cmd, 64);
 rc=run_cmd((char *)&qry, sizeof(struct plc_ascii_cmd_qry), &rep, _cmd->flg);
 return rc;
}

void main(void)
{.....
case CONTINUE:
 pthread_sleepon_lock();
 continue_flg= 1;
 pthread_sleepon_broadcast(&continue_flg);
 pthread_sleepon_unlock();
 .....

PS: адреса flg main и thread совпадают (проверял под DDD)
Используются 2 адреса для ждущих блокировок, напр
&go_flg== 0x807f070
&continue_flg== 0x807f034
2 thread висят (condvar)на разных (этих) флагах - наблюдаю DDD (триггеруется один из них)
pidin утверждает, что висят на одном 0x807e060

Переделал все на condvar. Результат такой же: pidin утверждает, что thread в сост CONDVAR висят на рпзных condvar с разными адресами(разные condvar), но каждый на 8 байт ниже печатаемого отладочным printf в программе.

Триггерации не происходит.

Спасибо.
Записан
Страниц: [1]
  Печать  
 
Перейти в: