Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 这个代码是线程安全的吗?_.net_C++_Multithreading_Thread Safety - Fatal编程技术网

.net 这个代码是线程安全的吗?

.net 这个代码是线程安全的吗?,.net,c++,multithreading,thread-safety,.net,C++,Multithreading,Thread Safety,我正在编写一些代码,其中UI线程需要与进行网络通信的后台线程进行通信。代码可以工作,但它会被认为是线程安全的吗 如果有经验的人能引导我走上正确的道路,我会感觉好多了 static Mutex^ mut_currentPage = gcnew Mutex; static array<unsigned char>^ m_currentPage; property array<unsigned char>^ Write { void set(array<unsi

我正在编写一些代码,其中UI线程需要与进行网络通信的后台线程进行通信。代码可以工作,但它会被认为是线程安全的吗

如果有经验的人能引导我走上正确的道路,我会感觉好多了

static Mutex^ mut_currentPage = gcnew Mutex;
static array<unsigned char>^ m_currentPage;

property array<unsigned char>^ Write
{
    void set(array<unsigned char>^ value) 
    {
        mut_currentPage->WaitOne();
        m_currentPage = value;
        mut_currentPage->ReleaseMutex();
    }
}
static Mutex^mut\u currentPage=gcnew Mutex;
静态数组^m_currentPage;
属性数组^Write
{
无效集(数组^value)
{
mut_currentPage->WaitOne();
m_currentPage=值;
mut_currentPage->ReleaseMutex();
}
}

这是.NET C++代码……:)p> 如果您在进程中使用线程,并且您只需要互斥,请使用监视器而不是互斥,我相信这会更有效


看起来还可以,但是在读取值时也应该锁定,否则就没有什么可以说它不会过时。另一种方法是使变量可变(至少在C#-我不知道C++/CLI中的等价物是什么。)

它看起来是线程安全的,但您可能需要考虑异常处理;设置字段不应该出错(可能除了
ThreadAbortException
),但如果代码更复杂,则需要确保在出现异常时释放互斥

我还要看一下
监视器
(“锁定”在C#中)


还有一个想法:即使锁定字段访问,数组本身也是可变的。考虑使用<代码> String < /代码>,因为这是不可变的。

关于异常安全性:实际上,MutX上的MutDN文本示例甚至不关心通过RAII引入锁定。这看起来像是倒退了十年。