- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在我的应用程序中使用 ZeroMQ 进行网络连接,手册指出通过向 send
中的 flags
参数提供 ZMQ_DONTWAIT
标志或recv
导致函数不阻塞线程。然而,它在我的情况下不起作用:
std::cout << "a";
if(ToSend.try_pop(send))
{
std::cout << "b";
local.send(send.data(),send.size(),ZMQ_DONTWAIT);
}
std::cout << "c";
if(local.recv(recv.data(),Networking::max_packet,ZMQ_DONTWAIT))
std::cout << "Received: " << (char*)recv.data() << std::endl;
std::cout << "d" << std::endl;
这打印:
abcdab
我做了一个小类来让事情变得更简单:
客户端类(为了简化,从所有“未使用”的东西中剥离出来)
class client
{
public:
client()
{
}
inline bool init(unsigned short threads = 1)
{
Running = true;
context = zmq_init (threads);
if(context == NULL)
return false;
socket = zmq_socket (context, ZMQ_REQ);
if(socket == NULL)
return false;
return true;
}
inline int connect(const char * address, unsigned short port)
{
return zmq_connect(socket,string_format("tcp://%s:%d",address,port).c_str());
}
inline bool send (void *data, size_t len_, int flags_ = 0)
{
message_t request (len_);
memcpy ((void *) request.data (), data, len_);
int rc = zmq_send (socket, request.data(), request.size(), flags_);
if (rc >= 0)
return true;
if (rc == -1 && zmq_errno () == EAGAIN)
return false;
throw error_t ();
}
inline bool recv (void * data, size_t len_, int flags_)
{
message_t reply(len_);
int rc = zmq_recv (socket, reply.data(), len_, flags_);
if (rc >= 0)
{
memcpy (data,(void *)reply.data(), reply.size());
return true;
}
if (rc == -1 && zmq_errno () == EAGAIN)return false;
throw error_t ();
}
inline bool IsRunning()
{
return Running;
}
private:
void * context;
void * socket;
std::atomic<bool> Running;
};
这是工作线程:
namespace Data
{
Concurrency::concurrent_queue <message_t> ToSend;
void Processor(char * address, unsigned short port, unsigned short threads)
{
client local;
if(!local.init(threads))return;
if(local.connect(address,port) != 0)return;
message_t recv(Networking::max_packet);
message_t send(Networking::max_packet);
while(local.IsRunning())
{
std::cout << "a";
if(ToSend.try_pop(send))
{
std::cout << "b";
local.send(send.data(),send.size(),ZMQ_DONTWAIT);
}
std::cout << "c";
if(local.recv(recv.data(),Networking::max_packet,ZMQ_DONTWAIT))
std::cout << "Received: " << (char*)recv.data() << std::endl;
std::cout << "d" << std::endl;
}
}
};
不知何故这里存在问题。我只是不知道为什么它不起作用。
这是我启动工作线程的方式:
int Thread(char * address, unsigned short port, unsigned short threads)
{
std::thread data(Data::Processor,address,port,threads);
data.detach();
while(!Data::status){}
return Data::status;
}
int main(int argc, char* argv[])
{
std::thread s(Server::RUN);
Client::message_t tosend(14);
memcpy((void*)tosend.data(),"Hello World !\0",14);
Client::Data::ToSend.push(tosend);
std::cout << Client::Thread("127.0.0.1",5555,1) << std::endl;
s.join();
return 0;
}
这一切似乎都是正确的,那么为什么 recv/send 会阻塞我的线程呢?为什么标志不起作用?
最佳答案
它打印了“abcd”,然后是“ab”。这意味着代码
std::cout << "a";
if(ToSend.try_pop(send))
{
std::cout << "b";
尽管您在问题末尾显示的代码暗示您只执行了一次 ToSend.push(),但执行了两次。
您是否附加了调试器以查看哪个线程被挂起以及它的调用堆栈是什么?
关于c++ - ZMQ_DONTWAIT 标志不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15582169/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!