2012-02-15 2 views
1

Если у меня есть класс с переменными 5 членов, например,Мьютекса

class XYZ 
{ 
public: 
double x1; 
...... 
double x5; 
}; 

Есть 5 нитей, которые каждый из них доступ 1 член переменных одного и тот же объекта (который один неизвестен). Если я хочу сделать его потокобезопасным и эффективным, необходимо также создать 5 элементов-мьютексов в классе. Иными словами,

class XYZ 
{ 
public: 
double x1; 
...... 
double x5; 
boost::mutex mutex1; 
...... 
boost::mutex mutex5; 
}; 

Спасибо.

+1

Возможно, вы можете использовать 'std :: atomic ' и не выполнять ручную синхронизацию, если это опция. –

ответ

2

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

+0

Благодарим вас за ответ. Является ли это хорошим многопоточным дизайном? Я имею в виду наличие 1 мьютекса для каждого члена объекта внутри класса. – 2607

+0

@ 2607: Я думаю, вы понимаете, что это не очень элегантный дизайн, но он выполнит свою работу. Трудно сказать, как вы можете избежать этого, пока не будут полностью известны требования и подход вашей реализации. –

+0

Пример более упрощен, на самом деле это то, чего я пытаюсь достичь. У меня есть вектор объектов M, и каждый объект имеет N переменных-членов. Есть потоки X, и каждый из них может обращаться к любым переменным-членам любого объекта внутри вектора. Я пытаюсь добиться этого, а также иметь минимальный критический раздел, т. Е. Блокировать как можно меньше каждый раз. Благодарю. – 2607

Смежные вопросы