Цитата(Olej @ Oct 24 2007, 19:24)

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

В ошибках в коде

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

Точнее можно только по коду сказать.
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