【发布时间】:2010-11-09 19:33:46
【问题描述】:
我必须模拟轮盘赌游戏来完成我们的讲师给我们的练习(不计分)。它必须是多线程客户端-服务器应用程序。 我正在设计服务器(客户端非常简单,它只需要发送赌注的请求)但我被卡住了。 我有两个线程函数, 荷官:这个每 N 秒拉出一次数字(在命令行中指定) 玩家:这个人读取荷官抽出的号码,并在共享列表中下注。每个玩家都可以下注一次或多次。
我的问题是:我可以使用 cond_timedwait 来模拟两个数字被拉出的时间间隔吗?还有其他方法吗?
void *croupier(void *arg) {
struct timespec cond_time;
time_t now;
int status;
int intervallo = (int) arg;
//initializerand seed
srand(time(NULL));
while (1) {
//lock mutex for number extraction
status = pthread_mutex_lock(&puntate_mutex);
if (status != 0) {
err_abort(status, "Lock sul mutex nel croupier");
}
//number extraction
estratto = rand() % 37;
printf("CROUPIER estratto=%d\n", estratto);
/* wake up players */
status = pthread_cond_broadcast(&puntate_cond);
if (status != 0) {
err_abort(status, "Broadcast condition in croupier");
}
now = time(NULL);
cond_time.tv_sec = now + intervallo;
cond_time.tv_nsec = 0;
//wait for condition
while (estratto > 0) {
status = pthread_cond_timedwait(&croupier_cond, &puntate_mutex, &cond_time);
//if status == ETIMEDOUT, time is over
if (status == ETIMEDOUT) {
printf("CROUPIER time's over!!! Bets closed\n");
estratto = -1; //bets closed
break;
}
if (status != 0) {
err_abort(status, "Timedwait croupier");
}
}
printf("CROUPIER Gestisco la puntata\n");
//TODO manage bets
status = pthread_mutex_unlock(&puntate_mutex);
if (status != 0) {
err_abort(status, "Unlock sul mutex nel player");
}
}
pthread_exit(NULL);
}
void *player(void *arg) {
int num = (int) arg;
int letto = 0;
int status;
while (1) {
status = pthread_mutex_lock(&puntate_mutex);
if (status != 0) {
err_abort(status, "Lock sul mutex nel player");
}
/* (estratto < 0) means that bets are closed */
while (estratto < 0) {/* if bets are closed */
printf("GIOCATORE %d CONDIZIONE FALSA\n", num);
letto = 0;
pthread_cond_wait(&puntate_cond, &puntate_mutex); //TODO inserire gestione errori
}
//here player can bet
/*???????
* read bet on socket
* insert bet in list
* */
status = pthread_mutex_unlock(&puntate_mutex);
if (status != 0) {
err_abort(status, "Unlock sul mutex nel player");
}
}
pthread_exit(NULL);
}
【问题讨论】:
-
英文的cmets会有所帮助..
-
感谢您指出这一点。
标签: c multithreading unix