唐先生,对于信号灯的使用,很迷惑。

刚才写了一段关于用信号灯实现生产消费的程序,但是,action按钮按下后,窗口消失,没有输出结果。很迷惑,请不吝赐教。
sem_t* mutex;
sem_t* nstore;
sem_t* nempty;
pthread_t thread_1;
pthread_t thread_2;
pthread_attr_t attr1;
pthread_attr_t attr2;
int i=0;
char buffer[10];
void
produce_t(void
arg)

{
sem_wait(nempty);
sem_wait(mutex);
sem_getvalue(nstore,&i);
buffer_=1;
sem_post(mutex);
sem_post(nstore);

return 0;
}
void* consume_t(void* arg)
{
sem_wait(nstore);
sem_wait(mutex);
sem_getvalue(nstore,&i);
buffer[i+1]=2;
sem_post(mutex);
sem_post(nstore);

return 0;
}


int
action( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t cbinfo )

{

/
eliminate ‘unreferenced’ warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;
sem_init(mutex,0,1);
sem_init(nstore,0,0);
sem_init(nempty,0,10);
memset(buffer,0,10);

pthread_attr_init( &attr1 );
pthread_attr_init( &attr2 );
/*pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED); */
/*pthread_attr_setdetachstate(&attr2, PTHREAD_CREATE_DETACHED); /
/
start and init routines (serial and IT) */
pthread_create(thread_1, &attr1, &produce_t, NULL);
pthread_create(thread_2, &attr2, &consume_t, NULL);
PtSetResource(ABW_PtMultiText_result,Pt_ARG_TEXT_STRING,buffer,0);
sleep(10);

return( Pt_CONTINUE );

}

唐先生,可不可以讲解一下信号灯使用应该注意的问题。谢谢了。_

是不是该在ptsetresource 前加上sleep,生产和消费thread改成while(1)?

我不知道你具体要做什么。不过我猜你或者在ptsetresource前加pthread_join(),或者就是象你所说的让生产和消费死循环(线程不退出),不过这样的话,你每按一次按钮就会多生成两个线程。

还有,你在buffer里写入1或者2,我不知道这个buffer还能不能正常当成Text_String显示。我想,你应该是用’1’和’2’吧。

信号灯和pthread_mutex_lock( &mutex)有什么区别呀,不都是锁么