.net 这个代码是线程安全的吗?
我正在编写一些代码,其中UI线程需要与进行网络通信的后台线程进行通信。代码可以工作,但它会被认为是线程安全的吗 如果有经验的人能引导我走上正确的道路,我会感觉好多了.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
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引入锁定。这看起来像是倒退了十年。