linux 下多线程扑克游戏框架
#define PLAYERCOUNT 4#define
PLAYED_CARDS_NO 4#define PLAYING_WAITING
10#define BUFFER_RECV 128
#ifdef DEBUG #define DPRINTF(s) printf s#else #define
DPRINTF(s)#endif#define ERR_HANDLER(s) {perror s;
exit(-1);}
typedef enum{ STAGE_HANPAI = 0,
STAGE_CALC}stage_t;
typedef struct barrier_hanpai_tag{ int mailbox_hanpai; /* 空
闲标志。0 为空闲,1 为繁忙 */ pthread_mutex_t m_hanpai[2];
/*m_hanpai[0] 与同步信号配套的互斥量 m_hanpai[1] 确保
喊牌期间运行控制线程( RC 线程)首先执行 */
pthread_cond_t c_hanpai_P2RC; /* 喊牌期间,玩家发给运
行控制线程的同步信号 */}barrier_hanpai_t,
*barrier_hanpai_p;
typedef struct barrier_calc_tag{ int mailbox_calc; /* 空闲标
志。 0 为空闲, 1 为繁忙 */ pthread_mutex_t m_calc[2];
/*m_calc[0] 与同步信号配套的互斥量 m_calc[1] 确保出牌
(计算)期间运行控制线程首先执行 */ pthread_cond_t
c_calc_P2RC; /* 计算期间, 玩家发给运行控制线程的同步信
号*/}barrier_calc_t, *barrier_calc_p;
typedef struct barrier_tag{ int sqno; /* 玩家序号 */ pthread_t
player[PLAYERCOUNT]; pthread_mutex_t m_global; /* 确
保运行控制线程每局均能首先运行 */ pthread_mutex_t
m_interplayer; /* 玩家线程间的互斥 */ pthread_cond_t
c_RC2P; /* 喊牌、计算期间, RC 线程发给玩家线程的信号
*/ pthread_cond_t c_ready_P2RC; /* 每局牌开始时的同步 */
struct barrier_hanpai_tag barrier_hanpai; struct
barrier_calc_tag barrier_calc;}barrier_t, *barrier_p;
typedef void (*sighandler_t)(int);
sigset_t signal_set;int repeatflag_hanpai = 1,
repeatflag_calc = 1, quitflag = 0;int player_hanpai_decision
= 0xca;char player_status_play = 0;char
player_status_hanpai = 0;sigjmp_buf
jmpbuf_hanpai[4];sigjmp_buf jmpbuf_calc[4];
void hanpai(int counter, int sqno, barrier_p mybarrier){ char
buffer[10];
/* 若为第