Мое требование следующее:
- Существует процесс с несколькими потоками.
- Один из потоков (T1) запускается пользовательским событием
- Существует задача, которую необходимо выполнить в отдельном потоке (T2), который должен вызываться T1
- Теперь T1 должен проверить, что система еще не выполняет задачу в T2.Если его нет, то он должен вызвать T2 и затем выйти.Если T2 все еще работает, то я должен просто вернуться из T1, зарегистрировав ошибку.Я не хочу держать T1, пока T2 не будет завершен.
- T2 обычно занимает много времени.Таким образом, в случае, если T1 запущен до того, как T2 завершил, он должен просто вернуться с ошибкой.
- Намерение ни при каких обстоятельствах не должно быть двух потоков T2
Я используюмьютекс и семафор, чтобы сделать это, но может быть более простой способ.Вот что я делаю.
Mutex g_mutex;
Semaphore g_semaphone;
T1:
if TryLock(g_mutex) succeeds // this means T2 is not active.
spawn T2
else // This means T2 is currently doing something
return with an error.
wait (g_sempahore) // I come here only if I have spawned the thread. now i wait for T2 to pick the task
// I am here means T2 has picked the task, and I can exit.
T2:
Lock(g_mutex)
signal(g_semaphore)
Do the long task
Unlock(g_mutex)
И это прекрасно работает.Но я хочу знать, есть ли более простой способ сделать это.