【问题标题】:Time interval in thread线程中的时间间隔
【发布时间】: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


【解决方案1】:

只使用 sleep() 或 usleep() 将线程暂停必要的时间间隔可能会更简单。


更新:

只需在睡觉前解锁互斥锁,醒来时再次锁定。

将互斥锁视为保护对estratto 的访问——只要您正在修改/读取该共享值,您就希望锁定互斥锁。所以:

lock()
estratto = rand() % 37;
unlock()

特别注意:

  • 您通常不希望在持有互斥锁的同时执行终端 IO (printf)(如果该 IO 由于网络流量控制而被阻塞,则任何其他需要互斥锁的线程也会被锁定)

  • 你不需要锁定互斥锁来做pthread_cond_broadcast

【讨论】:

  • 使用 pthread_cond_timedwait 的原因是我需要一些方法来重新获得互斥锁并在时间到时停止所有玩家:我如何使用睡眠来做到这一点?
  • 感谢您的这些建议(尤其是终端 IO 建议),但我找不到使其工作的方法。如果我只 sleep() 线程如何在时间间隔过去时停止其他线程下注?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多