Я что-то вроде промежуточного программиста, но относительно новичок в многопоточности. На данный момент я работаю над приложением, со структурой, аналогичной следующей:Thread Безопасный доступ к данным, разделяемым между объектами
class Client
{
public:
Client();
private:
// These are all initialised/populated in the constrcutor.
std::vector<struct clientInfo> otherClientsInfo;
ClientUI* clientUI;
ClientConnector* clientConnector;
}
class ClientUI
{
public:
ClientUI(std::vector<struct clientInfo>* clientsInfo);
private:
// Callback which gets new client information
// from a server and pushes it into the otherClientsInfo vector.
synchClientInfo();
std::vector<struct clientInfo>* otherClientsInfo;
}
class ClientConnector
{
public:
ClientConnector(std::vector<struct clientInfo>* clientsInfo);
private:
connectToClients();
std::vector<struct clientInfo>* otherClientsInfo;
}
Несколько надуманный пример, я знаю. Поток программы заключается в следующем: строится
Client и заселяет otherClientsInfo и строит clientUI и clientConnector с указателем на otherClientsInfo.
clientUI вызывает synchClientInfo() в любое время, когда сервер связывается с ним с новой информацией о клиенте, анализирует новые данные и возвращает их обратно в otherClientsInfo или удаляет элемент.
clientConnector будет обращаться к каждому элементу в otherClientsInfo при вызове connectToClients(), но не будет изменять их.
Мой первый вопрос, является ли мое предположение, что если оба ClientUI и ClientConnector доступ otherClientsInfo в то же время, будет программа бомба из-за потоков небезопасность?
Если это так, то как я могу сделать доступ к потоку в другой среде, как, возможно, каким-то образом заблокировать его, пока один объект обратится к нему?
библиотека Что нить вы используете? – hirschhornsalz
Я использую инструментарий QT, который вызывает pthreads, поскольку я нахожусь в Linux/BSD , насколько я знаю. Из других ответов я думаю, что это может быть хорошая идея создать класс вокруг вектора и, возможно, использовать мьютексы до контролировать доступ к нему. Хорошая/плохая идея? – Conor
Хорошая идея, что-то вроде предложения Пита Киркхэма, вероятно, будет для вас лучшим. –