Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776

Мьютексы и семафоры QT

17.08.2015, 23:39. Показов 3892. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас проблемы с производительностью моей высокопроизводительной вычислительной техникой. Прошу помочь разобраться с мьютексами и семафорами.
Начну с мьютексов. Допустим у нас есть два потока Thread1 и Thread2, мы имеем мьютекс Mu, можете привести простейший пример синхронизации потоков с помощью этого мьютекса , включая описание класса мьютекса и объяснение всего происходящего?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2015, 23:39
Ответы с готовыми решениями:

SQLite и мьютексы
Имеется многопоточная программа. Потоки работают с базой данных (у каждого потока свое подключение, но база одна) Собственно вопрос:...

Семафоры
Добрый вечер!:) У меня есть семафор и несколько потоков. Один и тот же семафор используется в каждом потоке. Семафор у меня объявлен...

Буфер обмена и семафоры
Привет форумчане ... Работаю под линукс .. Запускаю одновременно два процесса ... Первый процес должен записать какие то данные в буфер...

11
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.08.2015, 02:36
Смотреть тут.
 Комментарий модератора 
Поступать так не хорошо. Если автор просит помощи в разъяснении сути вопроса не стоит отправлять его на сторонние сайты. Тем более это запрещено правилами форума и тем более там нет упоминания о семафорах.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
21.08.2015, 20:56  [ТС]
Можете помочь найти ошибку?
Программа слетает, после выполнения функции lock().

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <QtCore/QCoreApplication>
#include "Thread1.h"
#include "Thread2.h"
////#include <QIODevice>
////#include <QFile>
#include <QtCore>
#include <iostream>
 
using namespace std;
 
extern ss s1();
 
    QMutex *mutex = new QMutex;
 
    int tr2;
    
 
int main(int argc, char *argv[])
{
 
    QCoreApplication a(argc, argv);
 
QString str;
str.append("11");
 
    QFile *file = new QFile;
 
    file->setFileName("file.txt");
    file->open(QIODevice::WriteOnly);
    file->close();
 
 
    Thread2 thread2(file, mutex);
    thread2.start();
    delete mutex;
    delete file;
    return a.exec();
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "Thread1.h"
 
extern int tr2;
 
 
using namespace std;
 
Thread1::Thread1(QFile* file, QMutex* mutex)
{tr2 = 5;
    file1 = new QFile;
    file1->setFileName(file->fileName());
    //mutex1 = new QMutex;
    mutex1 = mutex;
}
 
Thread1::~Thread1(void)
{
    //delete file1;
    //delete mutex1;
}
 
void Thread1::run()
{
mutex1->lock();
    for(int i=0;i<300;i++)
    {
        cout<<"1\n";
    }
mutex1->unlock();
    cout<<"\nThread 1 ended!";
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "Thread2.h"
 
using namespace std;
 
 
Thread2::Thread2(QFile* file, QMutex* mutex)
{
    file1 = new QFile;
    file1->setFileName(file->fileName());
    //mutex1 = new QMutex;
    mutex1 = mutex;
}
 
Thread2::~Thread2(void)
{
    //delete file1;
    //delete mutex1;
}
 
void Thread2::run()
{
 
    mutex1->lock();
    for(int i=0;i<300;i++)
    {
    //  //file1->write("2");
    //  cout<<"2\n";
    }
    mutex1->unlock();
    cout<<"\nThread 2 ended!";
}
0
232 / 232 / 69
Регистрация: 30.09.2012
Сообщений: 545
21.08.2015, 22:08
Цитата Сообщение от Knjagskij Посмотреть сообщение
thread2.start();
delete mutex;
Сами создали поток и впихнули в него указатель на мьютекс и сразу же тот мьютекс и потерли, а значит лочите уже битый указатель, а это UB.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
21.08.2015, 22:15  [ТС]
Спасибо, а как очищать память от мьютекса? После выполнения последнего потока?
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
21.08.2015, 23:41
Knjagskij, выучить RAII
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
22.08.2015, 14:43  [ТС]
Это значит, что мы очищаем память через указатель внутри класса, принявший в качестве параметра указатель на мьютекс?

Добавлено через 14 часов 17 минут
Теперь в этот код добавил запись в файл, почему-то записывает только один погток из двух, причем cout на экран выводит вроде бы правильно и 1 и 1
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <QtCore/QCoreApplication>
#include "Thread1.h"
#include "Thread2.h"
////#include <QIODevice>
////#include <QFile>
#include <QtCore>
#include <iostream>
 
using namespace std;
 
//extern ss s1();
 
    QMutex *mutex = new QMutex;
 
    int tr2;
    
 
int main(int argc, char *argv[])
{
 
    QCoreApplication a(argc, argv);
 
QString str;
str.append("11");
 
    QFile *file = new QFile;
 
    file->setFileName("file.txt");
    file->open(QIODevice::WriteOnly);
    file->close();
 
 
    Thread2 thread2(file, mutex);
    Thread1 thread1(file, mutex);
    thread1.start();
    thread2.start();
    //delete mutex;
    delete file;
    return a.exec();
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "Thread1.h"
 
extern int tr2;
 
 
using namespace std;
 
struct ss
{
    ss(void);
    void a(void);
};
 
ss s1();
 
Thread1::Thread1(QFile* file, QMutex* mutex)
{tr2 = 5;
    file1 = new QFile;
    file1->setFileName(file->fileName());
    //mutex1 = new QMutex;
    mutex1 = mutex;
}
 
Thread1::~Thread1(void)
{
    //delete file1;
    //delete mutex1;
}
 
void Thread1::run()
{
 
    file1->open(QIODevice::Append);
    mutex1->lock();
    for(int i=0;i<30;i++)
    {
        file1->write("1");
        cout<<"1\n";
    }
    file1->close();
    mutex1->unlock();
    cout<<"\nThread 1 ended!";
    //tr = 5;
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "Thread2.h"
 
using namespace std;
 
 
Thread2::Thread2(QFile* file, QMutex* mutex)
{
    file1 = new QFile;
    file1->setFileName(file->fileName());
    //mutex1 = new QMutex;
    mutex1 = mutex;
}
 
Thread2::~Thread2(void)
{
    //delete file1;
    //delete mutex1;
}
 
void Thread2::run()
{
 
    file1->open(QIODevice::Append);
    mutex1->lock();
    for(int i=0;i<30;i++)
    {
    file1->write("2");
        cout<<"2\n";
    }
    file1->close();
    mutex1->unlock();
    cout<<"\nThread 2 ended!";
}
 
//void Thread2::
//{
//}
Добавлено через 1 минуту
Кстати, еще есть проблема в том, что не переносится структура ss в main
C++ (Qt)
1
extern ss s1();
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
22.08.2015, 20:55
Ну так сначала один поток запишет данные, потов второй.
И lock нужно делать в начале метода.

Цитата Сообщение от Knjagskij Посмотреть сообщение
что не переносится структура ss в main
Кто куда не переносится?
Вы этот код в main написали? Откуда он знает от структуре ss?
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
22.08.2015, 23:59  [ТС]
Спасибо! Хедер со структурой ss включается через директиву #includ и extern-ом подключается ss
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.08.2015, 00:15
Структура должна быть в хедере. Что вы пытаетесь сделать через extern не понятно, но скорее всего вы не правильно понимаете работу extern.
0
-2 / 8 / 2
Регистрация: 10.11.2008
Сообщений: 776
23.08.2015, 01:02  [ТС]
Как я понимаю, если у нас объявлена переменная в одном файле и мы хотим ее распространить и на другой, то в другом прописываем extern тип переменной имя
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.08.2015, 01:09
Knjagskij, наоборот.

extern только один раз указывается в каком-то хедере, затем этот хедер подключается где нужно и используется эта перемененная. Так же нужно не забывать ее определить.

В общем первая ссылка гугла: http://stackoverflow.com/quest... files-in-c
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.08.2015, 01:09
Помогаю со студенческими работами здесь

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

Объекты синхронизации. мьютексы, семафоры
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные характеристики мьютекса должны быть аналогичны соответствующему...

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

Синхронизация используя семафоры или мьютексы
Добрый день, добрые люди подскажите у меня есть 4 потока и в них выполняеться вычеление функции A= (B+C)*(MC*MD), и мне нужно все 4 потока...

Работа на Java с WinAPI (мьютексы, семафоры)
Добвый вечер! Удобно ли работать на java с winapi, а именно интересует меня синхронизация процессов (мьютексы, семафоры и тд)? Можете...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru