【发布时间】:2016-01-22 04:56:26
【问题描述】:
我有一个要求,我必须在套接字上写入,然后从套接字连续读取响应并处理数据。 我创建了 2 个类 A 和 B。A 有 write() 和 read() api,B 有 processdata() api。 我创建了从 A::read() 到 B::processdata() 的回调。 但是我正面临多线程问题,因为我是新手。 read() api 的线程必须始终运行,但是在处理 B::processdata() 中的数据时,服务器正在我丢失的套接字 read() 上发送更多数据。 请为此问题提出一些设计建议,以便我可以继续存储数据,而我的 processdata 函数可以完成其工作并可以再次回来读取数据(带有小示例)? 我正在考虑维护 3 个线程,每个 write 、 read 和 processdata 1 个。但是我不确定在完成 processdata 线程后如何返回读取线程。
很抱歉,这篇文章很长,但如果有人可以帮助我,我将不胜感激。
以下是我在项目中的高级代码设计。
//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)
}
}
【问题讨论】:
-
为什么不能尝试使用临界区?据我了解,您问的是线程同步?
-
您需要复制
buffer的内容或使用多个缓冲区,以便在处理早期数据的同时继续接收数据。您必须有一些方法来存储这些缓冲区,直到B可以处理它们,同时让B线程等待数据可用。 2 个线程之间的同步至关重要。 -
@Akhil:请原谅我的天真,但您是在谈论使用 semaphore/mutex 保护我的缓冲区吗?我的问题是,在处理数据时,我在套接字上阻塞读取,因为我的代码将处理数据。所以我需要帮助创建一个多线程模型。你能帮我举个小例子吗?
-
@1201ProgramAlarm 你能给我一个小例子吗?我会非常乐于助人,非常感谢。
-
这不是一堆微不足道的代码。查找“生产者消费者问题”。
标签: c++ multithreading sockets client-server