我在延迟加载的DLL中有一个实例(全局/静态对象)ClassA.这个对象里面有一个"Observer"线程,它是执行正常关闭所必需的.当我调用FreeLibrary时,我注意到在删除此静态对象期间,我的线程请求关闭但挂起_endthreadex()并导致死锁.如果我明确地或隐含地调用_endthreadex并不重要.对象是全局的还是静态的 - 无关紧要 - 结果相同.此线程包含在ClassB中(由带有自定义消息循环的模板实现).有一个请求关闭线程(post message)和WaitForSingleObject,它永远不会返回给定的线程heandle.
在代码和关机的任何地方都使用相同的"模板线程类".删除静态obj时唯一的问题.我认为_endthreadex()里面有一些锁已经锁定在dll卸载和删除静态对象上.
线程以_beginthreadex开头.PS.当我在App-app内部实例化相同的静态obj时,没有任何重大问题.
任何想法为什么_endtreadex导致死锁?怎么避免呢?
我刚刚下载了LZ4-HC压缩源并检查它是否具有64位兼容性.
我收到的警告很少"从'__64'转换为'unsigned int',可能会丢失数据"
当我继续挖掘时,我注意到宏ADD_HASH(p).该宏的最后一部分是
HashTable[HASH_VALUE(p)] = (p) - base;
p - const BYTE*
base - const BYTE* const for 64-bit. (const int b - for 32-bit)
HTYPE HashTable[];
HTYPE is U32 for 64-bit platform (const BYTE* - for 32-bit)
Run Code Online (Sandbox Code Playgroud)
在32位上发生了什么 - 我们从指针中减去const int并存储到另一个指针 - 足够安全.
现在64:我认为在64上减去两个指针并将它们保存到U32根本不安全!
我的理解是LZ4只有在保证"p"和"base"相距不远的情况下才是64位兼容的......现在我必须深入研究逻辑以检查它.
我错过了什么吗?有没有人检查过这个库,因为它声称是完整的64位兼容性?图书馆代码还有其他任何已知问题吗?
我有一个侦听线程,等待使用select和FD_SET在几个套接字上读取。故事是。在某个时候,我将向池中添加另一个套接字,并且需要中止选择并重新初始化选择的FD_SET数组。我有一个事件来通知池更改。但是select如何对我的活动做出反应?select()在此时间点使用timeval,等待间隔为20秒,并且我不想将时间更改为较低的值。我不想通过超时频繁重新启动select()...
有什么方法可以中止选择吗?什么是正确的方法来通知/重新启动选择并强制使用新的套接字列表(至少一个套接字将添加到池中)
另一个问题-Msdn说:“选择功能确定一个或多个套接字的状态,必要时等待执行同步I / O。” 这是否意味着select不适用于使用异步操作转换为使用的套接字?
我有一些问题使用const_cast删除constness.错误消息说"转换是有效的标准转换......"
这个问题的本质是什么?我为什么要使用C风格的演员?
"错误C2440:'const_cast':无法从'const size_t'转换为'size_t'""转换是一种有效的标准转换,可以隐式执行,也可以使用static_cast,C风格的转换或函数式转换"
template<typename T>
const IFixedMemory* FixedMemoryPkt<T>::operator=(const IFixedMemory* srcObj)
{
// doesn't remove constness this way. why?
const_cast<char*> (this->m_Address) = (char*)srcObj->GetAddress();
// compile this way, but maybe(?) undefined behaviour
// const_cast<char*&> (this->m_Address) = (char*)srcObj->GetAddress();
// doesn't doesn't work too
const_cast<size_t> (this->m_Size) = (size_t)(srcObj->GetSize());
// const_cast<size_t> (this->m_Size) = 0;
return this;
}
template<typename T>
class FixedMemoryPkt : public IFixedMemory
{
private:
const size_t m_Size;
const char* m_Address;
}
class IFixedMemory
{
public:
virtual const char* GetAddress() const = 0; …Run Code Online (Sandbox Code Playgroud)