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

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
wbn
Senior Member
帖子: 97
注册时间: 周四 10月 21, 2004 3:22 pm

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

帖子 wbn » 周二 4月 05, 2005 3:20 pm

刚才写了一段关于用信号灯实现生产消费的程序,但是,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 );

}

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

wbn
Senior Member
帖子: 97
注册时间: 周四 10月 21, 2004 3:22 pm

帖子 wbn » 周三 4月 06, 2005 3:50 pm

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

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周三 4月 06, 2005 4:50 pm

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

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

magic_mage
New Member
帖子: 7
注册时间: 周二 8月 02, 2005 10:43 am

帖子 magic_mage » 周二 8月 02, 2005 11:06 am

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

回复