powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / контейнеры STL и многопоточность
25 сообщений из 85, страница 2 из 4
контейнеры STL и многопоточность
    #34562673
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- пишет:
> Для безопасного доступа к вектору нужно пользоваться не итератором, а
> оператором [].

Для безопасного ОТ ЧЕГО ?
Впрочем, пофигу, это одно и то же.

> По поводу защиты.
> Изменение может быть двух видов
> 1. Изменение размера контейнера, для этого можно воспользоваться
> предложенным мною выше.

Изменение может быть одного вида : "изменение".

> 2. Изменение элемента контейнера, В этом случае для всех нитей можно
> завести общий список изменяемых обьектов в данный момент, и изменять
> разные элементы паралельно.

Это - изменение не контейнера, а хранимого объекта.
Это уже - проблема самого объекта.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34562682
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
onstat- пишет:
> почему не будет?
....
> Подскажите где я не прав.

Вот что б я чего-то там понял.

Разве этого не достаточно ?

> 1. Проверяем мютексы на чтение и на запись,
> если кто то пишет, спим пока не освободится.

делаем дело, освобождаем мьютексы.


Posted via ActualForum NNTP Server 1.4

Проблема мютексов в отличие от POSIX семафоров в том что нельзя
атомарно (( косистентно), (за один системный вызов)) проверить и изменить несколько штук( группу).
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34562701
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv

Это - изменение не контейнера, а хранимого объекта.
Это уже - проблема самого объекта.
Posted via ActualForum NNTP Server 1.4

Изза одного изменяемого обьекта из 1000 вы предлагаете спать всем, кто
даже не планирует иметь к нему доступ, Хотя это дело личное.

Мое дело предложить, а автору топика решать как быть.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34563219
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синхронизировать доступ нужно к контейнеру map. Хотелось бы решение максимально простое. А насчёт идеи отельно синхронизировать запись и чтение надо подумать.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34564135
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- пишет:
> Проблема мютексов в отличие от POSIX семафоров в том что нельзя
> атомарно (( косистентно), (за один системный вызов)) проверить и
> изменить несколько штук( группу).

Я не говорил, что их надо одновременно лочить. Сначала один,
на чтение, потом другой, на запись.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34564431
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv



Разве этого не достаточно ?

onstat- пишет:
> 1. Проверяем мютексы на чтение и на запись,
> если кто то пишет, спим пока не освободится.

делаем дело, освобождаем мьютексы.


MasterZiv

Я не говорил, что их надо одновременно лочить. Сначала один,
на чтение, потом другой, на запись.
Posted via ActualForum NNTP Server 1.4

При установке мютекса на чтение никакая другая сессия через него пройти не сможет.
А как же паралельное чтение? Когда всетаки освобождаем?
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568248
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь упоминали семафоры для решения данной задачи, инересно, а каким образом для решения задачи можно применить световоры? И всё же вопрос четкого ответа не прозвучало. Не понял идею с отдельной синхронизации для операций чтения и записи. Один из потоков периодически обходит контейнер map с помощью итератора и выполняет расчёты. В то же время другие потоки могут обновлять контейнер. Самый дубовый случай запретить доступ к контейнеру на время обхода его обхода и при обновлению. В простейшем случаем можно использовать один мьютекс (или критическую секцию). Может в моём случае это и прокатит, но, если размер контейнера довольно большой эффективность видимо значительно снизится.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568336
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 OLEG_2005
Я в начале давал ссылочку на библиотеку. Там есть набор набор синхронизующих объектов, в том числе и RW блокировка. Код там не сложный. Почитай, там и доки к ней лежат.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568406
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там много документов. А в двух коротко идею можно объясниться. Просто есть идея написать класс, которые будет хранить данные в контейнеры map и о был потокобезопасным.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568437
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати забыл уточнить платформа Windows.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568847
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Там много документов. А в двух коротко идею можно объясниться. Просто есть идея написать класс, которые будет хранить данные в контейнеры map и о был потокобезопасным.
Не силен я виндовс, но там и для него реализания есть. Вопрос а надо-ли делать потоко-безопасный map или лучше сделать потоко-безопасный прикладной контейнер. Кстати а что будешь делать с итераторами по контейнеру? Их тоже переписывать?
Тем не менне за выходные расковыряю или сам?
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568918
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую кратко описать задачу. Моя программа обменивается с подсистемой сбора данных (с датчиков снимаются аналоговые и дискретные сигналы и по опросу выдаюётся моей программе).
В программе есть несколько контейнеров: текущие аналоговые сигналы, текущие дискретные сигналы и очередь событий. При получении данных от подсистемы сбора данные данные текущих состояний они помещаются в соответствующий контейнер. Этот же контейнер используется потоком котороый заниманется аръивирование текущих состояний (периодиский обходит контейнер, выполняет расчёты и пишет в БД). Использую контейнер map, в котором ключом является идентификатор аналогового или дискретного сигнала. Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34568946
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока копаю. Но других работоспособных и одновременно простых решений пока не вижу. Не хотелось бы усложнять.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34569204
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Здесь упоминали семафоры для решения данной задачи, инересно, а каким образом для решения задачи можно применить световоры?

Вот упрощенная версия, работает только в Unix.


[SRC locks.h]

/**************************=-OpenDSA-=******************************

This file is a part of OpenDSA project(http://sourceforge.net/projects/opendsa)
It can be destributed independently of OpenDSA with safe license of
OpenDSA. OpenDSA is destributed by GPL license.
(04.06.2006).
All rights reserved by (C) Konstantin Kaduk 2006.

*******************************************************************/


#include <stdio.h> // standard I/O routines.
#include <sys/types.h> // various type definitions.
#include <sys/ipc.h> // general SysV IPC structures
#include <sys/sem.h> // shared memory functions and structs.
#include <errno.h>
#include <string.h>


/*******************************************************************



*******************************************************************/


#ifndef SEM_LOCK_H
#define SEM_LOCK_H
extern int rc; // any results

#define MAXSETSIZE 3
/*******************************************************************



*******************************************************************/
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* array for GETALL, SETALL */
/* Linux specific part: */
struct seminfo *__buf; /* buffer for IPC_INFO */
};



/*******************************************************************



*******************************************************************/

#define LOC_SEM_CNT 3
class c_lock

/*******************************************************************
Class c_lock provide objects locking for reading and writing

1. READ locking
Any concurent processes can read data which locked by another.
Each process incerase semaphore(0) counter for place reading lock.
When write lock was placed(semaphore(1)) by another process
reading process will sleep while writing lock will be dropped.
Counter is decreased when reding lock is dropped by current process.


2. Write locking
Writing process sleeps while any another process is reading or writing
data now.It wake ups when counter(semaphotre 1) of reading process
is equal to zero. It places writing lock by two semaphores(1,2):
Semaphore 1 is used for place writing lock (using for check by
reading processes).
Semaphore 2 is used for exclusive lock(only one process can use data
at the same time).

////////End of original coment form Konstantin Kaduk ////////////////////////

Remark1:

///////

*******************************************************************/


{
int s_set_id;
struct sembuf s_sem_op[LOC_SEM_CNT];
union semun s_semun;
unsigned short s_semarray[LOC_SEM_CNT]; //array for semop
public:
c_lock(int sem_id=0);
~c_lock();

int lock_init(int sem_id);


void stat(const char* f_comment=NULL ); // print current values of semaphore

void r_lock(); // place reading lock

void r_unlock(); // decrease reading counter

void w_lock(); // place writing lock

void w_unlock(); // drop writing lock


};

#endif

[/src]


[SRC locks.cpp]
/**************************=-OpenDSA-=******************************

This file is a part of OpenDSA project(http://sourceforge.net/projects/opendsa)
It can be destributed independently of OpenDSA with safe license of
OpenDSA. OpenDSA is destributed by GPL license (04.06.2006).

All rights reserved by (C) Konstantin Kaduk 2006.

*******************************************************************/



#include "sem_lock.h"

/******************************************************************

*******************************************************************/

c_lock::c_lock(int sem_id):s_set_id(0)
{
if(sem_id!=0)
lock_init(sem_id);

};

/******************************************************************

*******************************************************************/
c_lock::~c_lock()
{
int rc=semctl(s_set_id, 0, IPC_RMID);
};

/******************************************************************

*******************************************************************/
int c_lock::lock_init(int sem_id)
{
printf("initing semaphore lock [%d]\n", sem_id);

s_set_id = semget(sem_id, 3, IPC_CREAT | 0600);
if(s_set_id==-1)
{
printf("Unable to allocate semaphore errno %d [%s]\n",errno, strerror(errno));
throw int(10);
};
s_semun.array=&s_semarray[0];
s_semarray[0]=0; //reading
s_semarray[1]=0; //writing
s_semarray[2]=1; // spin lock

rc = semctl(s_set_id, 3, SETALL, s_semun );
if(rc == -1)
{
printf("Problem to set sem value %d [%s]\n",errno, strerror(errno));
throw int(11);
};

return 0;
};


/******************************************************************

*******************************************************************/


void c_lock::stat( const char* f_comment)
{
s_semun.array=&s_semarray[0];
int rc = semctl(s_set_id, 0,GETALL, s_semun);

if (f_comment!=NULL) printf("****** %s ******\n", f_comment);
printf("SEM values READ WRITE WRSPIN\n");
printf(" [%d] [%d] [%d] \n", s_semarray[0], s_semarray[1], s_semarray[2]);
printf("*********************************\n");
};

/******************************************************************


*******************************************************************/

void c_lock::r_lock()
{

struct sembuf sem_op;

stat( "before read lock");

//increse for reading
s_sem_op[0].sem_num = 0;
s_sem_op[0].sem_op = 1; //increase read value
s_sem_op[0].sem_flg = 0;//IPC_NOWAIT;
//check for write
s_sem_op[1].sem_num = 1;
s_sem_op[1].sem_op = 0; // check for write
s_sem_op[1].sem_flg = 0;//IPC_NOWAIT;

rc=semop(s_set_id, &s_sem_op[0], 2);
stat("read locked");


};


/******************************************************************

*******************************************************************/


void c_lock::r_unlock()
{
struct sembuf sem_op;
stat("read unlocking");

s_sem_op[0].sem_num = 0;
s_sem_op[0].sem_op = -1; //decrease reading value
s_sem_op[0].sem_flg = 0;

rc=semop(s_set_id, &s_sem_op[0], 1);
stat(" read unlocked");

};

/******************************************************************

*******************************************************************/


void c_lock::w_lock()
{


stat("write locking");

//increse for read
s_sem_op[0].sem_num = 0;
s_sem_op[0].sem_op = 0;
s_sem_op[0].sem_flg = 0;//IPC_NOWAIT;
//check for write
s_sem_op[1].sem_num = 1;
s_sem_op[1].sem_op = 1; // check for write
s_sem_op[1].sem_flg = 0;//IPC_NOWAIT;

s_sem_op[2].sem_num = 2;
s_sem_op[2].sem_op = -1; // set for exclusive
s_sem_op[2].sem_flg = 0;//IPC_NOWAIT;

rc=semop(s_set_id, &s_sem_op[0], 3);

stat("write locked");

};

/******************************************************************

*******************************************************************/


void c_lock::w_unlock()
{
stat("write unlocking");
s_sem_op[1].sem_num = 1;
s_sem_op[1].sem_op = -1;
s_sem_op[1].sem_flg = 0;
s_sem_op[2].sem_num = 2;
s_sem_op[2].sem_op = 1; // check for spin write
s_sem_op[2].sem_flg = 0;//IPC_NOWAIT;


rc=semop(s_set_id, &s_sem_op[1], 2);
stat("write unlocked");

};

[/SRC]
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34569667
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 пишет:

> другие потоки могут обновлять контейнер. Самый дубовый случай запретить
> доступ к контейнеру на время обхода его обхода и при обновлению. В
> простейшем случаем можно использовать один мьютекс (или критическую
> секцию). Может в моём случае это и прокатит, но, если размер контейнера

Вот так и сделай, раз в что-то более сложное не врубаешься.
Для начала сойдет. Если совсем будет туго, тогда будешь уже
усовершенствованиями заниматься.

> довольно большой эффективность видимо значительно снизится.

Ничего , переживешь. Не миллионы же у тебя там.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34570742
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что выросло, то выросло(с)
Собственно на скрепке что получается, только я не отлаживал
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34571302
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedЧто выросло, то выросло(с)
Собственно на скрепке что получается, только я не отлаживал
А в чём смысл константной функции-члена? Никогда с ними не сталкивался.
void read_lock() const;
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34571445
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedЧто выросло, то выросло(с)
Собственно на скрепке что получается, только я не отлаживал

Большое спасибо, за пример. Раньше не использовал семафоры. Попытаюсь разобраться. Только не совсем понятно почему не обойтись одним мьютексом.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34571629
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков.Варианты.
1) пайп
2) двойная буферизация
3) считывающий поток для обработки дублирует себе контейнер
4) пишущий поток может добавлять данные не по одному, а пачками.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34571632
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 blindedЧто выросло, то выросло(с)
Собственно на скрепке что получается, только я не отлаживал
А в чём смысл константной функции-члена? Никогда с ними не сталкивался.
void read_lock() const;
Ну это-то понятно, обычно методы которые читают const и чтобы каждый раз не писать mutable на замке сделано const
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34572299
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo OLEG_2005Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков.Варианты.
1) пайп
2) двойная буферизация
3) считывающий поток для обработки дублирует себе контейнер
4) пишущий поток может добавлять данные не по одному, а пачками.

А можно пояснить первые два вариант, что вы под ними подразумеваете.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34572804
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь.
2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем.
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34572814
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в первом случае свой протокол надо делать если у тебя нефиксированный размер структуры или в чём ты там инфу передаёшь…
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34573110
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь.
Ну уж ежели делать то не pipe. а publish-subscribe. ээто когда специальный поток мультиплексирует
входную очередь сообщений на множество потребителей.
maXmo2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем.
Ну чего уж мелочитьсяю Пусть некоторый поток проецирует входные сообщения на модель и с некоторй частотой делает с этой модели мгновенную копию и публикует ее, все кому охота отображать - берет копию и чего-то с ней делает, потом хватает новую. Главное чтобы копия оставалась readonly
...
Рейтинг: 0 / 0
контейнеры STL и многопоточность
    #34574163
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь.
2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем.

Все-таки не понятно насчёт пайпа. Один поток пишет в контейнер, другой читает. Т.е. читающие или пишуще потоки монопольно захватывают контейнер или в чём фокус?
А в методе двойной буферизации надо как заполняются буфера для записи и для чтения?
...
Рейтинг: 0 / 0
25 сообщений из 85, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / контейнеры STL и многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]