Должен ли QMutex быть статичным, чтобы другие вызовы потоков этого экземпляра класса знали, чтобы приостановить свои операции?

Из нескольких потоков вызывается следующая функция добавления. Я не хочу, чтобы данные переписывали приложение, потому что счетчик еще не был увеличен.

Будет ли это приостановлено все входящие потоки, кроме той, которая в данный момент использует 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();
}

4

Решение

Нет, это не должно быть 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*/
}
3

Другие решения

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

1

Чтобы решить мою проблему, после нескольких запусков мне пришлось сделать мьютекс «Статическим» из-за множественных экземпляров класса 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();
}
0

@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++;
}
0

Поскольку я не знаю, как на самом деле работает 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
}

}
-4
По вопросам рекламы [email protected]