#c# #.net #thread-safety #threadpool
#c# #.net #потокобезопасность #threadpool
Вопрос:
Я использую C # с .net 4.0
Является ли ThreadPool.QueueUserWorkItem потокобезопасным?
Пример:
Parallel.ForEach(commands, commandModel =>
{
ThreadPool.QueueUserWorkItem(TestService.ProcessTest, test.ID);
});
Комментарии:
1. Пожалуйста, объясните, что вас беспокоит, что может произойти.
2. Почему вы используете несколько потоков только для постановки работы в очередь в пуле потоков? Почему вы просто не используете обычный цикл foreach?
3. @BFree, может быть, существует очень много рабочих элементов, и они также могут быть поставлены в очередь параллельно, хотя я не знаю, будет ли это на практике быстрее, потому что очередь, скорее всего, синхронизирована в какой-то момент?
4. Что вы подразумеваете под «потокобезопасным» в этом контексте
5. Какой смысл использовать Parallel . ForEach ставить в очередь работу в пулах потоков? Итерации параллельного цикла. ForEach уже выполняется в параллельных потоках! Ваш код подобен междугороднему телефонному звонку вашей бабушке, чтобы попросить ее позвонить кому-то еще на большое расстояние.
Ответ №1:
Сама функция потокобезопасна, с другой стороны, элемент, который вы ставите в очередь, должен делать все, что он делает, с учетом потокобезопасности.
Комментарии:
1. Добавляя к вашему ответу, сам класс потокобезопасен. Будучи статическим классом, все статические функции в нем потокобезопасны.