C++ 用于在c+中读取和写入服务器的多线程+;
我有一个要求,我必须在套接字上写,然后连续地从套接字读取响应并处理数据。 我创建了两个类A和B。A有write()和read()api,B有processdata()api。 我已经创建了从A::read()到B::processdata()的回调。 但我面临着多线程的问题,因为我是新手。 Thread to read()api必须始终运行,但在处理B::processdata()中的数据时,服务器正在socket read()上发送更多数据,而我缺少这些数据。 请对此问题提出一些设计建议,以便我可以在processdata函数完成其工作时继续存储数据,并可以再次返回以读取数据(使用小示例)? 我在考虑维护3个线程,分别用于写入、读取和处理数据。但我不确定在完成processdata线程后如何返回读取线程 很抱歉发了这么长的帖子,但如果有人能帮我,我将不胜感激 下面是我在我的项目中进行的非常高级的代码设计C++ 用于在c+中读取和写入服务器的多线程+;,c++,multithreading,sockets,client-server,C++,Multithreading,Sockets,Client Server,我有一个要求,我必须在套接字上写,然后连续地从套接字读取响应并处理数据。 我创建了两个类A和B。A有write()和read()api,B有processdata()api。 我已经创建了从A::read()到B::processdata()的回调。 但我面临着多线程的问题,因为我是新手。 Thread to read()api必须始终运行,但在处理B::processdata()中的数据时,服务器正在socket read()上发送更多数据,而我缺少这些数据。 请对此问题提出一些设计建议,以便
//A.cpp
class A {
public:
void write();
void read(b* obj);
}
void A::write()
{
//code to write to socket
}
void A::read(b* obj)
{
//code to read from socket
// if data received call below function
obj->processdata(buffer)
}
//B.cpp
class B {
public:
processdata(buffer)
}
void B::processdata(buffer)
{
//code to processdaata from socket
}
//Main.cpp
int main()
{
A* objA = new A;
B* objB = new B;
objA->write()
while(1)
{
objA->read(objB)
}
}
A.cpp
B.cpp
extern CRITICAL_SECTION g_cCritSec;
class B {
public:
static processdata( void *buffer)
}
void B::processdata(void *buffer)
{
Buffer *bufferReceive = (Buffer*)buffer;
//code to processdaata from socket
}
Main.cpp
CRITICAL_SECTION g_cCritSec;
int main()
{
InitializeCriticalSection(&g_cCritSec);
B* objB = new B;
objA->write();
uintptr_t Thread1 = _beginthread( A::read, 0, (void *) objB);
DeleteCriticalSection(&g_cCritSec);
}
这个答案对你有帮助吗?一个最小的多线程应用程序,将启动
Thread1
作为静态memeber函数A::Read
作为例程(我们需要将memeber函数定义为静态以用作线程回调)。从Read
函数,它将启动另一个线程,并将缓冲区的副本传递给它。这里两个线程将同时执行为什么不能尝试使用关键部分?据我所知,您正在询问线程同步?您需要复制缓冲区的内容
或使用多个缓冲区,以便在处理早期数据时继续接收数据。您必须有某种方法来存储这些缓冲区,直到B
能够处理它们,同时让B
线程等待数据可用。两个线程之间的同步是至关重要的。@Akhil:请原谅我的幼稚,你是说用信号量/互斥来保护我的缓冲区吗?我这里的问题是,在处理数据时,我阻止了套接字读取,因为我的代码将处理数据。因此,我需要帮助为同一个套接字创建多线程模型。你能帮我举个小例子吗?@1201程序你能给我举个小例子吗?我将非常乐于助人,非常感谢。这不是一批琐碎的代码。看看“生产者-消费者问题”。哇。这正是我想要的答案。谢谢你,伙计。我还有一个问题,关于线程和套接字,我应该使用boostlibs吗?我读到c++11有线程支持,但当我使用“thread t”时,我得到一个错误:“error:‘thread’不是‘std’的成员”:(另外,我必须使这段代码独立于操作系统,因为它可以在Linux和windows上交叉编译。你能提出一些建议吗?如果这能解决你的问题,请将其作为可接受的答案。尝试包括pthread.h并使用pthread_t(不是pthread t)类创建线程。请参阅pthread_create函数以创建posix线程。
CRITICAL_SECTION g_cCritSec;
int main()
{
InitializeCriticalSection(&g_cCritSec);
B* objB = new B;
objA->write();
uintptr_t Thread1 = _beginthread( A::read, 0, (void *) objB);
DeleteCriticalSection(&g_cCritSec);
}