我正在嘗試編寫一個代表與設備通過RS232連接進行通信的類。這個設備可以被讀取和寫入,這可以由多個線程完成。使用多線程使用的RS232?
到目前爲止,我選擇將該類設置爲單例類,因爲它有意義,只有一個連接到設備應該永遠存在。我還實施了兩個接口IDataProvider
和IDataConsumer
。這些只是定義了方法Boolean ReadData(out Object readData, params Object[] args)
和WriteData(Object inData, params Object[] args)
。隨着界面我也寫了RS232Device
。這實現了將端口Open()
,Close()
,Read()
和Write()
的方法。
以下是我的課程概述。
public class DeviceIO : RS232Device, IDataProvider, IDataConsumer
{
public static DeviceIO Instance { get { return lazyInstance.Value; } }
private static readonly Lazy<DeviceIO> lazyInstance
= new Lazy<DeviceIO>(() => new DeviceIO());
private DeviceIO() : base() {}
public void ConfigurePort(SerialPortConfig inConfig)
{
Configure(inConfig);
}
public Boolean ReadData(out Object readData, params Object[] args)
{
readData = null;
return false;
}
public Boolean WriteData(Object inData, params Object[] args)
{
return false;
}
}
我現在的問題是我如何使這個線程安全。我會假設在ReadData
和WriteData
之內,我會鎖定Object
的某個實例。這就是我需要做的一切嗎?基本上就像下面的修改一樣?
我可以將下面的Instance
分配給各種線程,並且在兩個線程可能嘗試同時寫入設備時沒有任何問題嗎?
public class DeviceIO : RS232Device, IDataProvider, IDataConsumer
{
public static DeviceIO Instance { get { return lazyInstance.Value; } }
private static readonly Lazy<DeviceIO> lazyInstance
= new Lazy<DeviceIO>(() => new DeviceIO());
private static readonly Object Schlage = new Object();
private DeviceIO() : base() {}
public void ConfigurePort(SerialPortConfig inConfig)
{
lock(Schlage)
{
Configure(inConfig);
}
}
public Boolean ReadData(out Object readData, params Object[] args)
{
lock (Schlage)
{
readData = null;
return false;
}
}
public Boolean WriteData(Object inData, params Object[] args)
{
lock (Schlage)
{
return false;
}
}
}
這是正確的。注意:你的'Schlage'變量不一定是'static'。 –
還有一個問題,大多數情況下,當你試圖查詢串口設備時,你首先向RS232寫入數據,然後讀取一行數據。如果我輸入'ReadData'方法並獲得一個鎖,我可以調用'WriteData'而不是自己死鎖嗎? – KDecker
一旦鎖定建立,'lock'只會阻止** OTHER **線程進入。從**相同的**線程內,從ReadData()到WriteData()不會阻塞,並且不會導致問題。 –