用c++写个线程模拟进程同步通信,哪位大神帮我写下,感谢

[复制链接]
查看11 | 回复7 | 2021-1-27 07:12:48 | 显示全部楼层 |阅读模式
三个线程同时对一个数据进行读写操作,其中A进程按照顺序写入一个整数1-20;并显示发送的数据。其中奇数发送给B进程,偶数发送给C进程。B/C进程分别读取数据,若不是发送给自己的数据则不读取,否则接收并显示数据,同时通知A进程发送另外一个数据。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
既然奇数发给B偶数发给C,何来不是发送给自己的数据?
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
引用1楼636f6c696e的回复:既然奇数发给B偶数发给C,何来不是发送给自己的数据?
奇数发给B偶数发给C就行,大神您会吗
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
这个跟多线程没多大关系,设计个队列做为缓冲接收就行了吧
A只管发,其它不用管,缓冲设计够大就行了
BC只管从缓冲读取,不存在同步问题,主要处理队列缓冲就可以了
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
引用3楼gouyanfen的回复:这个跟多线程没多大关系,设计个队列做为缓冲接收就行了吧
A只管发,其它不用管,缓冲设计够大就行了
BC只管从缓冲读取,不存在同步问题,主要处理队列缓冲就可以了

您能帮我写一下吗,要交报告了,感谢您
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
引用4楼半世梦的回复:Quote: 引用3楼gouyanfen的回复:这个跟多线程没多大关系,设计个队列做为缓冲接收就行了吧
A只管发,其它不用管,缓冲设计够大就行了
BC只管从缓冲读取,不存在同步问题,主要处理队列缓冲就可以了

您能帮我写一下吗,要交报告了,感谢您

不用谢,只提供思路,没时间帮这种忙
回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
引用5楼gouyanfen的回复:Quote: 引用4楼半世梦的回复:
Quote: 引用3楼gouyanfen的回复:这个跟多线程没多大关系,设计个队列做为缓冲接收就行了吧
A只管发,其它不用管,缓冲设计够大就行了
BC只管从缓冲读取,不存在同步问题,主要处理队列缓冲就可以了

您能帮我写一下吗,要交报告了,感谢您

不用谢,只提供思路,没时间帮这种忙

好吧,那也感谢了




回复

使用道具 举报

千问 | 2021-1-27 07:12:48 | 显示全部楼层
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef_MSC_VER
#pragmawarning(disable:4996)
#endif
#include
#include
#include
#ifdef_MSC_VER
#include
#include
#include
#defineMYVOIDvoid
#definevsnprintf_vsnprintf
#else
#include
#include
#include
#defineCRITICAL_SECTIONpthread_mutex_t
#defineMYVOIDvoid*
#endif
//Log{
#defineMAXLOGSIZE20000000
#defineMAXLINSIZE16000
#include
#include
#include
charlogfilename1[]="MyLog1.log";
charlogfilename2[]="MyLog2.log";
staticcharlogstr[MAXLINSIZE+1];
chardatestr[16];
chartimestr[16];
charmss[4];
CRITICAL_SECTIONcs_log;
FILE*flog;
#ifdef_MSC_VER
voidLock(CRITICAL_SECTION*l){
EnterCriticalSection(l);
}
voidUnlock(CRITICAL_SECTION*l){
LeaveCriticalSection(l);
}
voidsleep_ms(intms){
Sleep(ms);
}
#else
voidLock(CRITICAL_SECTION*l){
pthread_mutex_lock(l);
}
voidUnlock(CRITICAL_SECTION*l){
pthread_mutex_unlock(l);
}
voidsleep_ms(intms){
usleep(ms*1000);
}
#endif
voidLogV(constchar*pszFmt,va_listargp){
structtm*now;
structtimebtb;
if(NULL==pszFmt||0==pszFmt[0])return;
vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour,now->tm_min,now->tm_sec);
sprintf(mss,"%03d",tb.millitm);
printf("%s%s.%s%s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if(NULL!=flog){
fprintf(flog,"%s%s.%s%s",datestr,timestr,mss,logstr);
if(ftell(flog)>MAXLOGSIZE){
fclose(flog);
if(rename(logfilename1,logfilename2)){
remove(logfilename2);
rename(logfilename1,logfilename2);
}
}else{
fclose(flog);
}
}
}
voidLog(constchar*pszFmt,...){
va_listargp;
Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
#defineASIZE200
#defineBSIZE240
#defineCSIZE2
charAbuf[ASIZE];
charCbuf[CSIZE];
CRITICAL_SECTIONcs_HEX;
CRITICAL_SECTIONcs_BBB;
structFIFO_BUFFER{
inthead;
inttail;
intsize;
chardata[BSIZE];
}BBB;
intNo_Loop=0;
voidHexDump(intcn,char*buf,intlen){
inti,j,k;
charbinstr[80];
Lock(&cs_HEX);
for(i=0;i=len){
lent=len;
if(fbuf->head+lent>BSIZE){
len1=BSIZE-fbuf->head;
memcpy(buf,fbuf->data+fbuf->head,len1);
len2=lent-len1;
memcpy(buf+len1,fbuf->data,len2);
fbuf->head=len2;
}else{
memcpy(buf,fbuf->data+fbuf->head,lent);
fbuf->head+=lent;
}
fbuf->size-=lent;
}
Unlock(cs);
returnlent;
}
MYVOIDthdB(void*pcn){
char*recv_buf;
intrecv_nbytes;
intcn;
intwc;
intpb;
cn=(int)pcn;
Log("%03dthdBthreadbegin...\n",cn);
while(1){
sleep_ms(10);
recv_buf=(char*)Cbuf;
recv_nbytes=CSIZE;
wc=0;
while(1){
pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
if(pb){
Log("%03drecv%dbytes\n",cn,pb);
HexDump(cn,recv_buf,pb);
sleep_ms(1);
}else{
sleep_ms(1000);
}
if(No_Loop)break;//
wc++;
if(wc>3600)Log("%03d%d==wc>3600!\n",cn,wc);
}
if(No_Loop)break;//
}
#ifndef_MSC_VER
pthread_exit(NULL);
#endif
}
intPutToRBuf(intcn,CRITICAL_SECTION*cs,structFIFO_BUFFER*fbuf,char*buf,intlen){
intlent,len1,len2;
Lock(cs);
lent=len;
if(fbuf->size+lent>BSIZE){
lent=BSIZE-fbuf->size;
}
if(fbuf->tail+lent>BSIZE){
len1=BSIZE-fbuf->tail;
memcpy(fbuf->data+fbuf->tail,buf,len1);
len2=lent-len1;
memcpy(fbuf->data,buf+len1,len2);
fbuf->tail=len2;
}else{
memcpy(fbuf->data+fbuf->tail,buf,lent);
fbuf->tail+=lent;
}
fbuf->size+=lent;
Unlock(cs);
returnlent;
}
MYVOIDthdA(void*pcn){
char*send_buf;
intsend_nbytes;
intcn;
intwc;
inta;
intpa;
cn=(int)pcn;
Log("%03dthdAthreadbegin...\n",cn);
a=0;
while(1){
sleep_ms(100);
memset(Abuf,a,ASIZE);
a=(a+1)%256;
if(16==a){No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
send_buf=(char*)Abuf;
send_nbytes=ASIZE;
Log("%03dsending%dbytes\n",cn,send_nbytes);
HexDump(cn,send_buf,send_nbytes);
wc=0;
while(1){
pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
Log("%03dsent%dbytes\n",cn,pa);
HexDump(cn,send_buf,pa);
send_buf+=pa;
send_nbytes-=pa;
if(send_nbytes3600)Log("%03d%d==wc>3600!\n",cn,wc);
}
if(No_Loop)break;//
}
#ifndef_MSC_VER
pthread_exit(NULL);
#endif
}
intmain(){
#ifdef_MSC_VER
InitializeCriticalSection(&cs_log);
InitializeCriticalSection(&cs_HEX);
InitializeCriticalSection(&cs_BBB);
#else
pthread_tthreads[2];
intthreadsN;
intrc;
pthread_mutex_init(&cs_log,NULL);
pthread_mutex_init(&cs_HEX,NULL);
pthread_mutex_init(&cs_BBB,NULL);
#endif
Log("Start===========================================================\n");
BBB.head=0;
BBB.tail=0;
BBB.size=0;
#ifdef_MSC_VER
_beginthread((void(__cdecl*)(void*))thdA,0,(void*)1);
_beginthread((void(__cdecl*)(void*))thdB,0,(void*)2);
#else
threadsN=0;
rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void*)1);if(rc)Log("%d=pthread_create%derror!\n",rc,threadsN-1);
rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void*)2);if(rc)Log("%d=pthread_create%derror!\n",rc,threadsN-1);
#endif
if(!access("No_Loop",0)){
remove("No_Loop");
if(!access("No_Loop",0)){
No_Loop=1;
}
}
while(1){
sleep_ms(1000);
if(No_Loop)break;//
if(!access("No_Loop",0)){
No_Loop=1;
}
}
sleep_ms(3000);
Log("End=============================================================\n");
#ifdef_MSC_VER
DeleteCriticalSection(&cs_BBB);
DeleteCriticalSection(&cs_HEX);
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_BBB);
pthread_mutex_destroy(&cs_HEX);
pthread_mutex_destroy(&cs_log);
#endif
return0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行