LINUX.ORG.RU

Потоки

 


0

1

Всем привет. Кто более или менее знает теорию потоков, объясните пожалуйста: Можно ли вызывать у какого либо объекта функцию из разных потоков одновременно, а в этой функции использовать QMutex для блокировок, или нужно при любом обращении к объекту делать блокирование, например какой алгоритм правильный:

//псевдокод
ОБЪЕКТ
{
функция()
{
блокировать;
логика;
разблокировать;
}
};

поток1()
{
ОБЪЕКТ->функция()
}

поток2()
{
ОБЪЕКТ->функция()
}
или лучше так: или вообще без разницы
//псевдокод
ОБЪЕКТ
{
функция()
{
логика;
}
};

поток1()
{
блокировать;
ОБЪЕКТ->функция()
разблокировать;
}

поток2()
{
блокировать;
ОБЪЕКТ->функция()
разблокировать;
}

и еще вопрос, что если я буду просто переменную bool использовать в качестве флага блокировки правильно ли это будет, и чем это отличается от QMutex. Внятных ответов для себя в доке не нашел. Прошу помощи.

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

Можно. Нужно использовать один общий на два потока мутекст, естественно.

и еще вопрос, что если я буду просто переменную bool использовать в качестве флага блокировки правильно ли это будет, и чем это отличается от QMutex.

Булевый флаг можно использовать только, чтобы узнать состояние. Поставить блокировку, наткнувшись на которую другой поток будет ждать разблокирования, не получится.

staseg ★★★★★
()

за первый вариант.

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

http://qt-doc.ru/qmutex-myuteksy-v-qt.html

anonymous
()

просто есть одна статическая singleton функция, и есть необходимость защитить ее от доступа из разных потоков, значит буду использовать вариант 1. Спасибо.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

В C++11 получение экземпляра синглтона Мейерса является потокобезопасным. Может тебе ничего и менять не нужно?

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от staseg

Булевый флаг можно использовать только, чтобы узнать состояние.

Вообще рекомендуется защищать даже чтение булевых переменных из-за того, что процессор кеширует данные.

m0rph ★★★★★
()
Ответ на: комментарий от staseg

Булевый флаг можно использовать только, чтобы узнать состояние. Поставить блокировку, наткнувшись на которую другой поток будет ждать разблокирования, не получится.

не получится

А про condition variable, которая wait() и signal() ты скромно умолчишь :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

А про condition variable, которая wait() и signal() ты скромно умолчишь :)

Condition variable - это не булевый флаг. (А скорее абстракция над мутексом или другим механизмом синхронизации)

Чисто на булевых флагах можно наклепать wait через вечный цикл, ждущий изменения флага... Но зачем?

staseg ★★★★★
()

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

да.

nanoolinux ★★★★
()

если я буду просто переменную bool использовать в качестве флага блокировки правильно ли это будет

нет не правильно, если хочешь переменную - используй QAtomicInt

shty ★★★★★
()
Ответ на: комментарий от staseg

Ну ты бы ТСу поцказал, например, что то, что он хочет, можно сделать при помощи «скорее абстракции» :) То есть, если хочется, вполне можно думать в терминах булевского флага и не мучить моск мутексами :)

slackwarrior ★★★★★
()
Ответ на: комментарий от Gorthauer

В студии оно не работает.

Проблема студии, не?

m0rph ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Это тот, у которого instance возвращает ссылку на статическую локальную переменную:

class Singleton {
public:
    static Singleton& instance()
    {
        static Singleton instance;
        return instance;
    }

private:        
    Singleton(){};
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
};

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 2)

моя бабушка мне говорит - защищай одновременный доступ к данным в потоке а не код

мне кажется первый вариант лучше - не забудешь, но лучше используй QMutexLocker

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.