2012-04-26 1 views
5

У меня есть несколько объектов, которые мне нужно выполнить из разных потоков в C++. Я знал, что необходимо заблокировать любую переменную, которая может использоваться более чем одним потоком одновременно, но что, если каждый поток обращается (записывает) к другому члену данных того же объекта? Например, каждый поток вызывает другой метод объекта, и ни один из методов, называемых модификацией одного и того же элемента данных. Является ли он безопасным, если я не получаю доступ к одному и тому же элементу данных или мне вообще нужно блокировать весь объект?Доступ к различным элементам данных, принадлежащим к одному и тому же объекту, из 2-х разных потоков в C++

Я искал пояснения и подробности по этой теме, но каждый пример, похоже, сосредоточен на одиночных переменных или нечленовских функциях.

Подводя итог: Могу ли я безопасно получить доступ к 2 различным элементам данных одного и того же объекта из 2 разных потоков без блокировки всего объекта?

+0

Как вы можете быть уверены, что никогда не сможете получить доступ к одному члену из двух потоков одновременно? –

+0

У вас нет блокировки для каждой переменной структуры вместо блокировки для каждой структуры. мелкозернистая блокировка ?? –

ответ

4

Это эффективно безопасно, но будет сильно уменьшать производительность вашего кода, если вы это часто делаете. Компьютеры используют вещи, называемые «линиями кеша», и если два процессора работают в одной и той же строке кэша, они должны будут передать его обратно & вперед все время, замедляя работу.

+0

+1 для ложного обмена –

+1

также может быть небезопасным, если элементы данных неправильно выровнены – user396672

2

Да, безопасно обращаться к различным членам одного объекта по разным ниткам.

1

Я думаю, что вы можете сделать это хорошо. Но вы должны быть уверены, что внутренняя структура метода никогда не изменится для доступа к тем же данным, или вызывающая программа не решит назвать другой метод, который уже использует другой поток.

Возможно, но потенциально опасно. Но тогда это также будет быстрее, потому что вы избежите звонков, чтобы получить мьютексы. Выбрать свой яд.

0

Безопасно, если я не получаю доступ к одному и тому же элементу данных, или мне нужно заблокировать весь объект?

Ответ полностью зависит от дизайна класса. Однако я бы все же сказал, что всегда рекомендуется думать 100 раз, прежде чем разрешать нескольким потокам доступ к одному и тому же объекту. Учитывая тот факт, если вы уверены, что данные действительно независимы их NO необходимо заблокировать весь объект.

Тогда возникает другой вопрос: «Если переменные действительно независимы Почему они находятся в одном классе?» Будьте осторожны при порезании резьбы, если ошибаетесь.

0

Ну, да, хорошо, вы можете это сделать, но, как указали другие, вам не придется этого делать. IMHO, доступ к членам данных должен осуществляться с помощью методов getter/setter, так что любые необходимые mutexing/criticalSectioning/semaphoring/whatever инкапсулируются внутри объекта.

0

Возможно, вы захотите быть осторожным. См. Например, http://gcc.gnu.org/ml/gcc/2012-02/msg00032.html В зависимости от того, как доступны поля, вы можете столкнуться с подобными трудностями, чтобы найти проблемы.