小编ads*_*px5的帖子

在卸载DLL时删除静态对象时退出线程导致死锁?

我在延迟加载的DLL中有一个实例(全局/静态对象)ClassA.这个对象里面有一个"Observer"线程,它是执行正常关闭所必需的.当我调用FreeLibrary时,我注意到在删除此静态对象期间,我的线程请求关闭但挂起_endthreadex()并导致死锁.如果我明确地或隐含地调用_endthreadex并不重要.对象是全局的还是静态的 - 无关紧要 - 结果相同.此线程包含在ClassB中(由带有自定义消息循环的模板实现).有一个请求关闭线程(post message)和WaitForSingleObject,它永远不会返回给定的线程heandle.

在代码和关机的任何地方都使用相同的"模板线程类".删除静态obj时唯一的问题.我认为_endthreadex()里面有一些锁已经锁定在dll卸载和删除静态对象上.

线程以_beginthreadex开头.PS.当我在App-app内部实例化相同的静态obj时,没有任何重大问题.

任何想法为什么_endtreadex导致死锁?怎么避免呢?

c++ windows multithreading deadlock

6
推荐指数
1
解决办法
2766
查看次数

LZ4压缩的源代码是否兼容64位?

我刚刚下载了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位兼容性?图书馆代码还有其他任何已知问题吗?

c++ compression 64-bit

5
推荐指数
1
解决办法
1362
查看次数

C ++ Win异步套接字。是否可以中断select()

我有一个侦听线程,等待使用select和FD_SET在几个套接字上读取。故事是。在某个时候,我将向池中添加另一个套接字,并且需要中止选择并重新初始化选择的FD_SET数组。我有一个事件来通知池更改。但是select如何对我的活动做出反应?select()在此时间点使用timeval,等待间隔为20秒,并且我不想将时间更改为较低的值。我不想通过超时频繁重新启动select()...

有什么方法可以中止选择吗?什么是正确的方法来通知/重新启动选择并强制使用新的套接字列表(至少一个套接字将添加到池中)

另一个问题-Msdn说:“选择功能确定一个或多个套接字的状态,必要时等待执行同步I / O。” 这是否意味着select不适用于使用异步操作转换为使用的套接字?

c++ sockets windows events

1
推荐指数
1
解决办法
1044
查看次数

C++.为什么我无法编译此代码?使用const_cast删除constness有什么问题?

我有一些问题使用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)

c++ const-cast

1
推荐指数
1
解决办法
933
查看次数