多线程同步 AND UI 线程同步。可以吗?
Mutli-threaded synchronization AND UI thread synchronization. Can it be done?
我正在制作一个库,它允许访问系统范围内的共享资源,并希望对其进行类似互斥锁的锁定。我以前用过Mutex
class来同步不同线程或进程的操作
在 UI 应用程序中可能会出现问题。我正在制作的库用于多个产品,其中一些是位于同一主机 UI 应用程序中的插件。因此,UI 线程对于库的每个实例都是相同的 - 因此即使资源已经被访问,mutex.WaitOne()
也会 return 为真。
'resource'是用户的关注度。无论哪个主机进程想要打开它,我都不想打开一个以上的特定子 window。此外,它可能是一个不同的线程知道何时可以释放互斥体(子 window 关闭)。
有没有我可以应用的 class 或模式,可以让我轻松解决这个问题?
总结一下我的意图,这可能是理想的虚构 class:
var specialMutex = new SpecialMutex("UserToastNotification");
specialMutex.WaitOne(0); // Returns true only once, even on the same thread,
// and is respected across different processes.
specialMutex.Release(); // Can be called from threads other than the one
// that called WaitOne();
是的,Release
看起来很危险,但它只被资源调用。
您可以使用 compare/exchange 操作来完成此操作。像这样:
class Lock {
int locked = 0;
bool Enter() { return Interlocked.CompareExchange(ref locked, 1, 0) == 0; }
void Leave() { Interlocked.CompareExchange(ref locked, 0, 1); }
}
在这里,Enter 只会 return 为真一次,无论它是从哪个线程调用的,直到您调用 leave。
我想你想要一个初始值为 1 的 Semaphore。任何对 Semaphore
上的 WaitOne()
的调用都会尝试减少计数,而不管线程如何。任何对 Release
的调用,无论调用它的线程如何,都会导致计数增加。
因此,如果单个线程初始化值为 1 的信号量,然后调用 WaitOne
,则计数将变为 0。如果同一个线程再次对同一个信号量调用 WaitOne
,线程将锁定等待释放。
其他一些线程可能会出现并调用 Release
来增加计数。
因此,虽然 Semaphore
与 不完全像 Mutex
,但它可能足够相似,可以让您的程序运行。
我正在制作一个库,它允许访问系统范围内的共享资源,并希望对其进行类似互斥锁的锁定。我以前用过Mutex
class来同步不同线程或进程的操作
在 UI 应用程序中可能会出现问题。我正在制作的库用于多个产品,其中一些是位于同一主机 UI 应用程序中的插件。因此,UI 线程对于库的每个实例都是相同的 - 因此即使资源已经被访问,mutex.WaitOne()
也会 return 为真。
'resource'是用户的关注度。无论哪个主机进程想要打开它,我都不想打开一个以上的特定子 window。此外,它可能是一个不同的线程知道何时可以释放互斥体(子 window 关闭)。
有没有我可以应用的 class 或模式,可以让我轻松解决这个问题?
总结一下我的意图,这可能是理想的虚构 class:
var specialMutex = new SpecialMutex("UserToastNotification");
specialMutex.WaitOne(0); // Returns true only once, even on the same thread,
// and is respected across different processes.
specialMutex.Release(); // Can be called from threads other than the one
// that called WaitOne();
是的,Release
看起来很危险,但它只被资源调用。
您可以使用 compare/exchange 操作来完成此操作。像这样:
class Lock {
int locked = 0;
bool Enter() { return Interlocked.CompareExchange(ref locked, 1, 0) == 0; }
void Leave() { Interlocked.CompareExchange(ref locked, 0, 1); }
}
在这里,Enter 只会 return 为真一次,无论它是从哪个线程调用的,直到您调用 leave。
我想你想要一个初始值为 1 的 Semaphore。任何对 Semaphore
上的 WaitOne()
的调用都会尝试减少计数,而不管线程如何。任何对 Release
的调用,无论调用它的线程如何,都会导致计数增加。
因此,如果单个线程初始化值为 1 的信号量,然后调用 WaitOne
,则计数将变为 0。如果同一个线程再次对同一个信号量调用 WaitOne
,线程将锁定等待释放。
其他一些线程可能会出现并调用 Release
来增加计数。
因此,虽然 Semaphore
与 不完全像 Mutex
,但它可能足够相似,可以让您的程序运行。