Попробуйте использовать умножение:
"amix=inputs="+ chunks.length + ":duration=first:dropout_transition=3,volume=" + chunks.length
Вы сказали, что несколько экземпляров одного приложения, таким образом, мы говорим приблизительно два под управлением program.exe, правильно? Оператор блокировки не заблокирует через несколько программ, только в рамках программы. Если Вы хотите истинное Взаимное исключение, смотрите на Систему. Поточная обработка. Взаимоисключающий объект.
Вот пример использования:
bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
try
{
mtx.WaitOne();
MessageBox.Show("Click OK to release the mutex.");
}
finally
{
mtx.ReleaseMutex();
}
}
createdNew переменная сообщит, была ли она создана в первый раз. Это только говорит Вам, если это было создано, все же. Если Вы хотите получить блокировку, необходимо назвать WaitOne и затем назвать ReleaseMutex для выпуска ее. Если Вы просто хотите видеть, создали ли Вы Взаимное исключение, просто создав оно прекрасно.
TheSeeker корректен.
Совет Jeff Richter в Сбросе Через C# (p638-9) на блокировке состоит в том, чтобы создать частный объект специально для цели быть заблокированным.
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
Это работает, потому что _lock не может быть заблокирован ничем вне текущего класса.
Править: это применимо к потокам, выполняющимся в рамках единственного процесса. ответ Mohundro @David корректен для межпроцессной блокировки.