我正在做一个项目,我需要通过 UDP 与特定的盒子交谈。在任何给定时间,只有一个盒子连接到系统。连接应该持续整个程序的持续时间。
我写了一个类(耶!)为硬件提供必要的数据。然而,我的主要问题是,现在我必须考虑这样一个事实,即某人(未来的程序员很可能会忽略我所有非常简洁的评论;))可能会创建多个此类的实例。这很可能会导致一些有趣且相当有趣的崩溃,其中有问题的硬件想知道为什么它要从同一台机器上的两个套接字接收数据。更麻烦的是创建对象实际上会产生一个定期发送更新的线程。所以你可以想象,如果我想象中的未来程序员做一些事情,比如创建这些对象的链表(毕竟这是 C++,我们有能力做这些事情),一段时间后 CPU 可能不会很高兴。
因此,我求助于您……过去曾见过此类问题的 SO 中更有经验的人。我一直在讨论创建一个单例来处理所有这些,但我的一些阅读让我相信这可能不是要走的路。互联网上有大量关于他们的信息,这几乎就像根据我看到的回复提出一个高度敏感的政治问题。
我开发的一种可以保留尽可能多代码的替代方法是仅使用静态布尔值来跟踪是否有活动线程将数据传递给硬件。但是,我怀疑我的方法可能会在我有竞争线程尝试同时访问该类的情况下导致竞争条件。到目前为止,这是我所拥有的:
// in MyClass.cpp:
static bool running_ = false; // declared in the class in the .h, but defined here
MyClass::MyClass() {
// various initialization stuff you don't care about goes here
if (pthread_create(mythread_, NULL, MyThreadFunc, this) != 0) {
// error
}
else {
// no error
}
}
static void* MyClass::MyThreadFunc(void* args) {
MyClass myclass = static_cast<MyClass>(args);
// now I have access to all the stuff in MyClass
// do various checks here to make sure I can talk to the box
if (!running_) {
running_ = true;
// open a connection
while (!terminate) { // terminate is a flag set to true in the destructor
// update the hardware via UDP
}
// close the socket
running_ = false;
}
}
虽然我当然注意到这将仅检查一个处于活动状态的实例,但仍有可能两个并发线程将同时访问 !running_ 检查并因此打开连接。
结果,我想知道我的选择是什么?我要实现单例吗?有没有办法让静态变量工作?或者,我是否只是评论这个问题并希望下一个程序员明白不要打开两个实例来与硬件对话?
一如既往,感谢您的帮助!
编辑添加:
我刚想到另一个想法……如果静态布尔值是静态锁呢?这样,我可以设置锁,然后让后续实例尝试获取锁,如果它们失败,则返回一个僵尸类......只是一个想法......