linux下多线程扑克游戏框架
linux下多线程扑克游戏框架
/*
*rc.c
*文件描述:
*1)提供了linux下“升级”(北方常见的一种扑克玩法)游戏的框架。
*2)库:glibc2.15;编译环境:gcc4.7.2;内核:3.8.4
* 3) 编译:gcc -pthread -DDEBUG -o rc rc.c
*作者:漂流骑士
*发布时间:2013.4.3
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PLAYERCOUNT4
#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];
/*若为第二次喊牌