如果锁定不安全,如何使安全阵列线程安全? 我正在编写一个C++的DLL,它从Excel VBA中传递了SAFAREL射线。DLL有多个线程共享安全阵列(读取和写入安全阵列)。在试图找出如何安全地进行共享时,我遇到了: 例如,考虑一个使用SavaRayLoCand和SavaRayunOnLood函数的应用程序。如果从同一SAFEARRAY数据类型实例上的不同线程并发调用这些函数,则可能会创建不一致的锁计数。这最终将导致SafeArrayUnlock函数返回意外的E_。您可以通过提供自己的同步代码来防止这种情况

如果锁定不安全,如何使安全阵列线程安全? 我正在编写一个C++的DLL,它从Excel VBA中传递了SAFAREL射线。DLL有多个线程共享安全阵列(读取和写入安全阵列)。在试图找出如何安全地进行共享时,我遇到了: 例如,考虑一个使用SavaRayLoCand和SavaRayunOnLood函数的应用程序。如果从同一SAFEARRAY数据类型实例上的不同线程并发调用这些函数,则可能会创建不一致的锁计数。这最终将导致SafeArrayUnlock函数返回意外的E_。您可以通过提供自己的同步代码来防止这种情况,c++,vb.net,multithreading,vba,safearray,C++,Vb.net,Multithreading,Vba,Safearray,这让我很困惑,因为我认为锁的全部目的是确保线程安全,很明显,这个锁定功能并不是为了这个目的。但是为什么需要在单线程应用程序中锁定呢 SafeArrayLock的文档还指出,函数“将一个指针放在数组描述符的pvData中的数组数据中”,但根据我的测试,即使从未调用过SafeArrayLock(且锁计数为0),pvData指针仍然有效。例如,此功能: void __declspec(dllexport) __stdcall testfun(VARIANT& vararr) { if

这让我很困惑,因为我认为锁的全部目的是确保线程安全,很明显,这个锁定功能并不是为了这个目的。但是为什么需要在单线程应用程序中锁定呢

SafeArrayLock的文档还指出,函数“将一个指针放在数组描述符的pvData中的数组数据中”,但根据我的测试,即使从未调用过SafeArrayLock(且锁计数为0),pvData指针仍然有效。例如,此功能:

void __declspec(dllexport) __stdcall testfun(VARIANT& vararr) {
    if (vararr.parray->cLocks != 0) throw -1; 
    else {
        double* data = (double*) vararr.parray->pvData;
        data[5] = 4.1;
    }
}
有效地写入存储在vararr中的数组,并且在调用该数组的VBA中可以看到更改。怎么回事


考虑到pvData的持久性和不安全的锁定机制,我的直觉是放弃所有数组操作函数,让我的线程随心所欲地访问pvData(写入操作从未发生冲突,所以会出什么问题?),但这里的其他人出于不清楚的原因警告不要手动操作数组。正确的方法是什么?提前感谢。

希望指针在以非文件方式使用时保持一致可能是一个冒险的想法;这样,疯狂和未定义的行为就存在了。还要记住,(a)“锁”在软件开发中有多种含义,(b)
SAFEARRAY
可能已经足够老了,以至于最初的开发人员不关心线程安全,因为没有人会在多核/处理器系统上使用它。