реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> POSIX pthread_* в Linux, когда появилось и как реализовано?
Olej
сообщение Oct 24 2007, 16:24
Сообщение #46


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(Johny @ Oct 24 2007, 19:08) *
я использую функции завершения потока, устанавливаемые макросом
pthread_cleanup_push

... я надеюсь он закрывается макросом pthread_cleanup_pop ? wink.gif

Цитата(Johny @ Oct 24 2007, 19:08) *
поток останавливается функцией
pthread_cancel

На PXA-255, ядро 2.4.19 компилятор gcc 3.3 все работает хорошо.

На Писюке с Ubuntu 7.04 компилятор gcc 4.1.2 (Ubuntu 4.1.2 - Qubuntu4) функции завершения потока, описанного в C - файле вызываются нормально. А вот функции завершения потока, описанного в CPP - файле не вызываются.

В чем может быть дело?

В ошибках в коде sad.gif ... например неправильной передаче pthread_cleanup_push адреса процедуры завершения, а ещё скорее - для неё параметров... кстати, функция потока в этом случае не должна завершаться pthread_cancel(), а должна pthread_cleanup_pop( 1 )...
Механизм pthread_cleanup_... , стека процедур завершения - нормально работает не только в GCC с соответствующим libstd 4.х, 3.х - но и 2.95.х ...

Ищите ошибку wink.gif
Точнее можно только по коду сказать.
Go to the top of the page
 
+Quote Post
Johny
сообщение Oct 30 2007, 06:08
Сообщение #47


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792



Цитата(Olej @ Oct 24 2007, 19:24) *
... я надеюсь он закрывается макросом pthread_cleanup_pop ? wink.gif
В ошибках в коде sad.gif ... например неправильной передаче pthread_cleanup_push адреса процедуры завершения, а ещё скорее - для неё параметров... кстати, функция потока в этом случае не должна завершаться pthread_cancel(), а должна pthread_cleanup_pop( 1 )...
Механизм pthread_cleanup_... , стека процедур завершения - нормально работает не только в GCC с соответствующим libstd 4.х, 3.х - но и 2.95.х ...

Ищите ошибку wink.gif
Точнее можно только по коду сказать.


pthread_cleanup_pop конечно же стоит - без него код не компилируется.

Код функции потока очень простой, в чем может быть ошибка - непонятно (чтобы нормально работало на писюке ввел флаг MesureRunning, для остановки потока вместо вызова pthread_cancel, сбрасываю флаг. Если не объявлять LINUX_PC, на писюке функция DestroyMesurer все равне не вызывается, и как следствие объект класса CImpMesurer не дестроится ).


#ifdef LINUX_PC
static int MesureRunning = 0;
extern "C" void* MesureProc (void* param);
#else
extern "C" static void* MesureProc (void* param);
extern "C" static void DestroyMesurer(void* Mesurer);
#endif

/*...Код других функций...*/

extern "C" void* MesureProc(void* param)
{
bool res;
int ret;
double RP, RM, RZ;
CImpMesurer* Mesurer;
MesureThreadPar *ThrParam = (MesureThreadPar*) param;
void ( *ReceiveImpedance)(void* ID, double RP, double RM, double RZ, int res);

void* ID = ThrParam->ID;
ReceiveImpedance = ThrParam->ReceiveImpedance;

free(ThrParam);

Mesurer = new CImpMesurer();

#ifdef LINUX_PC
while(MesureRunning==1)
#else
pthread_cleanup_push(&DestroyMesurer,(void*)Mesurer); /* add termination handler*/

while(1)
#endif
{
pthread_testcancel(); /* Tect cancel thread */
res=Mesurer->Mesure(&RP, &RM, &RZ); /* impedance mesure */
ret=res?0:1;
ReceiveImpedance(ID, RP, RM, RZ, ret); /*call call-back function*/
}
#ifndef LINUX_PC
pthread_cleanup_pop (1);
#else
delete Mesurer;
#endif
return NULL;
}

#ifndef LINUX_PC
extern "C" void DestroyMesurer(void* Mesurer)
{
delete (CImpMesurer*) Mesurer;
#ifdef DEBUG_
errout = fopen("/tmp/AudioAPIErr", "a");
fprintf(errout, "DestroyMesurer()\n");
fclose(errout);
#endif
}
#endif //LINUX_PC
Go to the top of the page
 
+Quote Post
Olej
сообщение Oct 31 2007, 13:50
Сообщение #48


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(Johny @ Oct 30 2007, 09:08) *
pthread_cleanup_pop конечно же стоит - без него код не компилируется.

Это уже хорошо wink.gif
"больной перед смертью потел? о! - это очень, очень хорошо"(с) wink.gif

Цитата(Johny @ Oct 30 2007, 09:08) *
Код функции потока очень простой, в чем может быть ошибка - непонятно (чтобы нормально работало на писюке ввел флаг MesureRunning, для остановки потока вместо вызова pthread_cancel, сбрасываю флаг. Если не объявлять LINUX_PC, на писюке функция DestroyMesurer все равне не вызывается, и как следствие объект класса CImpMesurer не дестроится ).

Ваш код слишком перегружен деталями ... чтобы в нём детально разбираться wink.gif
Я привык для непонятных мне вопросов вычленять специальный пример без всяких частностей и #if ... - сильно помогает... wink.gif
Но "на вскидку" в вашем примере ничего крамольного не видно... должон работать wink.gif
Гляньте:
http://qnxclub.net/modules.php?name=Forums...92&start=30
- там типично ваш пример, только в куда более изощрённых условиях... с прогонами и работающий...
Прогонялся он, правда, в QNX а не LINUX, в QNX гораздо более жёстко API следует семантике POSIX и ведёт себя соответствующе...
Прогоните такой (усечённый) пример в LINUX - будет сразу работать, значит у вас в чём-то недосмотр, не будет сразу работать - значит нужно что-то с опциями компиляции подыграть ... такое в LINUX бывает sad.gif

P.S. кстати, я совершенно не понял: "Если не объявлять LINUX_PC, на писюке ..."©
- кто такой писюк? а на чём это ещё (в каких условиях? в какой ОС? или что...) должно выполняться?
Go to the top of the page
 
+Quote Post
Johny
сообщение Nov 2 2007, 08:59
Сообщение #49


Частый гость
**

Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792



Цитата(Olej @ Oct 31 2007, 16:50) *
P.S. кстати, я совершенно не понял: "Если не объявлять LINUX_PC, на писюке ..."©
- кто такой писюк? а на чём это ещё (в каких условиях? в какой ОС? или что...) должно выполняться?


Писюк - это слэнг такой, означает х86 компьютер

-Сделал условную компиляцию для х86 машины: если объявлен LINUX_PC, pthread_cleanup_push не используется
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 14:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016