我用.net core 2.2 里面一句代码是var mutexSecurity = new MutexSecurity();
跑在windows没问题,跑在mac下的时候出了异常
看了许多文章。似乎System.Threading 下的这些mutex,信号量只能跑在 windows下
https://github.com/dotnet/coreclr/issues/1237
https://github.com/dotnet/docs/issues/3825
https://github.com/oleg-shilo/cs-script/issues/10
https://github.com/dotnet/coreclr/issues/3422
大佬们sos,请求帮助支援 @dudu
mac 上不支持 MutexSecurity ,建议使用其他 Mutex
还有其他啥mutex。。。(当然这里可以用redis同步锁等方案解决)
我觉得应该是有别的接口方式解决。
@dudu: 我看看 先
@dudu: 文章中 其他几种不是进程级别同步的吧
@TeemoHQ: Semaphore 可以用于进程级别的同步
按照这个说法应该一样
@dudu: 我找个时间试试,再回复你。。 阿里嘎多
@dudu:
一样
@TeemoHQ: 参考 https://stackoverflow.com/a/46329498/5989202 :
By default, names have session scope and sessions are more granular on Unix (each terminal gets its own session). Try adding a "Global" prefix to the name minus the quotes.
@dudu: mutex三个参数应该是可以,但是安全级别应该不可以,因为这份代码也挂在iis下面跑,所以有安全权限。但是netcore把这个去掉了,但我可以根据系统来是否要设置权限,我晚点试试,再回复你
@TeemoHQ: 我在 mac 上测试成功了,mutex 名称要以 Global\
开头,测试代码用的是 https://q.cnblogs.com/q/115648/ 中的
static void Main(string[] args)
{
string name = @"Global\tt1";
Console.WriteLine($"Using {name}");
using (Mutex mutex = new Mutex(true, name, out bool createNew))
{
Console.WriteLine("exists mutex " + createNew);
if (!createNew)
{
mutex.WaitOne();
}
Console.WriteLine("running");
Console.ReadLine();
mutex.ReleaseMutex();
Console.WriteLine();
Console.WriteLine("ReleaseMutex");
}
Console.ReadLine();
}