Из нескольких потоков вызывается следующая функция добавления. Я не хочу, чтобы данные переписывали приложение, потому что счетчик еще не был увеличен.
Будет ли это приостановлено все входящие потоки, кроме той, которая в данный момент использует Append? Или другие потоки просто продолжат работать и не будут добавлять данные?
Должен ли мьютекс быть «СТАТИЧЕСКИМ» или каждый экземпляр будет знать, чтобы приостановить операции?
Если я не хочу икоты, я предполагаю, что должен создать буфер для резервного копирования данных журнала?
void classA::Append(int _msg)
{
static int c = 0;
QMutex mutex; //need to be static so other threads know to suspend?
//there are 10 threads creating an instantiation of classA or an object of classA
mutex.lock();
intArray[c] = _msg;
c++;
mutex.unlock();
}
Нет, это не должно быть static
Просто сделайте это членом в вашем classA
а также вы можете взглянуть на QMutexLocker чтобы заблокировать и разблокировать мьютекс:
void classA::Append(int _msg)
{
static int c = 0;
QMutexLocker locker(&mutex); // mutex is a QMutex member in your class
intArray[c] = _msg;
c++;
/*mutex.unlock(); this unlock is not needed anymore, because QMutexLocker unlocks the mutex when the locker scope ends, this very useful especially if you have conditional and return statements in your function*/
}
QMutex не нужно объявлять как статический, и Qt будет гарантировать, что другие потоки будут ожидать разблокировки в мьютексе, прежде чем позволить другому потоку продолжить выполнение в этой функции.
Чтобы решить мою проблему, после нескольких запусков мне пришлось сделать мьютекс «Статическим» из-за множественных экземпляров класса A. Создание mutex-члена не сработало.
void classA::Append(int _msg)
{
static int c = 0;
static QMutex mutex; //YES... need to be static so other threads know to suspend
//there are 10 threads creating an instantiation of classA or an object of classA
mutex.lock();
intArray[c] = _msg;
c++;
mutex.unlock();
}
@jdl «Сделать мьютекс членом не получилось».
Да, это работает. Попробуйте сделать мьютекс «статическим» следующим образом:
//classA.h
class ClassA {
public:
static QMutex mutex;
// rest of variables and Methods
// ...
}//classA.cpp
QMutex ClassA::mutex; // Before all
ClassA::ClassA() {
//Constructor
}
void ClassA::Append(int _msg) {
static int c = 0
QMutexLocker locker(&mutex)
intArray[c] = _msg;
c++;
}
Поскольку я не знаю, как на самом деле работает QMutex, я просто сделал свой собственный мьютекс.
void classA::Append(int _msg)
{
static int c = 0;
static int mutex = 0; //YES... need to be static so other threads know to suspend
//there are 10 threads creating an instantiation of classA or an object of classA
while(mutex == 1){
//suspend thread
}
if(mutex == 0){
mutex = 1;//lock
intArray[c] = _msg;
c++;
mutex = 0;//unlock
}
}