|
|
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
onstat- пишет: > Для безопасного доступа к вектору нужно пользоваться не итератором, а > оператором []. Для безопасного ОТ ЧЕГО ? Впрочем, пофигу, это одно и то же. > По поводу защиты. > Изменение может быть двух видов > 1. Изменение размера контейнера, для этого можно воспользоваться > предложенным мною выше. Изменение может быть одного вида : "изменение". > 2. Изменение элемента контейнера, В этом случае для всех нитей можно > завести общий список изменяемых обьектов в данный момент, и изменять > разные элементы паралельно. Это - изменение не контейнера, а хранимого объекта. Это уже - проблема самого объекта. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2007, 20:47 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
MasterZiv onstat- пишет: > почему не будет? .... > Подскажите где я не прав. Вот что б я чего-то там понял. Разве этого не достаточно ? > 1. Проверяем мютексы на чтение и на запись, > если кто то пишет, спим пока не освободится. делаем дело, освобождаем мьютексы. Posted via ActualForum NNTP Server 1.4 Проблема мютексов в отличие от POSIX семафоров в том что нельзя атомарно (( косистентно), (за один системный вызов)) проверить и изменить несколько штук( группу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2007, 20:53 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
MasterZiv Это - изменение не контейнера, а хранимого объекта. Это уже - проблема самого объекта. Posted via ActualForum NNTP Server 1.4 Изза одного изменяемого обьекта из 1000 вы предлагаете спать всем, кто даже не планирует иметь к нему доступ, Хотя это дело личное. Мое дело предложить, а автору топика решать как быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2007, 21:05 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Синхронизировать доступ нужно к контейнеру map. Хотелось бы решение максимально простое. А насчёт идеи отельно синхронизировать запись и чтение надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 09:18 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
onstat- пишет: > Проблема мютексов в отличие от POSIX семафоров в том что нельзя > атомарно (( косистентно), (за один системный вызов)) проверить и > изменить несколько штук( группу). Я не говорил, что их надо одновременно лочить. Сначала один, на чтение, потом другой, на запись. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 12:24 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
MasterZiv Разве этого не достаточно ? onstat- пишет: > 1. Проверяем мютексы на чтение и на запись, > если кто то пишет, спим пока не освободится. делаем дело, освобождаем мьютексы. MasterZiv Я не говорил, что их надо одновременно лочить. Сначала один, на чтение, потом другой, на запись. Posted via ActualForum NNTP Server 1.4 При установке мютекса на чтение никакая другая сессия через него пройти не сможет. А как же паралельное чтение? Когда всетаки освобождаем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 13:22 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Здесь упоминали семафоры для решения данной задачи, инересно, а каким образом для решения задачи можно применить световоры? И всё же вопрос четкого ответа не прозвучало. Не понял идею с отдельной синхронизации для операций чтения и записи. Один из потоков периодически обходит контейнер map с помощью итератора и выполняет расчёты. В то же время другие потоки могут обновлять контейнер. Самый дубовый случай запретить доступ к контейнеру на время обхода его обхода и при обновлению. В простейшем случаем можно использовать один мьютекс (или критическую секцию). Может в моём случае это и прокатит, но, если размер контейнера довольно большой эффективность видимо значительно снизится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 15:19 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
2 OLEG_2005 Я в начале давал ссылочку на библиотеку. Там есть набор набор синхронизующих объектов, в том числе и RW блокировка. Код там не сложный. Почитай, там и доки к ней лежат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 15:31 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Там много документов. А в двух коротко идею можно объясниться. Просто есть идея написать класс, которые будет хранить данные в контейнеры map и о был потокобезопасным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 15:42 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Кстати забыл уточнить платформа Windows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 15:48 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Там много документов. А в двух коротко идею можно объясниться. Просто есть идея написать класс, которые будет хранить данные в контейнеры map и о был потокобезопасным. Не силен я виндовс, но там и для него реализания есть. Вопрос а надо-ли делать потоко-безопасный map или лучше сделать потоко-безопасный прикладной контейнер. Кстати а что будешь делать с итераторами по контейнеру? Их тоже переписывать? Тем не менне за выходные расковыряю или сам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 17:07 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Попробую кратко описать задачу. Моя программа обменивается с подсистемой сбора данных (с датчиков снимаются аналоговые и дискретные сигналы и по опросу выдаюётся моей программе). В программе есть несколько контейнеров: текущие аналоговые сигналы, текущие дискретные сигналы и очередь событий. При получении данных от подсистемы сбора данные данные текущих состояний они помещаются в соответствующий контейнер. Этот же контейнер используется потоком котороый заниманется аръивирование текущих состояний (периодиский обходит контейнер, выполняет расчёты и пишет в БД). Использую контейнер map, в котором ключом является идентификатор аналогового или дискретного сигнала. Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 17:23 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Пока копаю. Но других работоспособных и одновременно простых решений пока не вижу. Не хотелось бы усложнять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 17:29 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2007, 18:42 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 пишет: > другие потоки могут обновлять контейнер. Самый дубовый случай запретить > доступ к контейнеру на время обхода его обхода и при обновлению. В > простейшем случаем можно использовать один мьютекс (или критическую > секцию). Может в моём случае это и прокатит, но, если размер контейнера Вот так и сделай, раз в что-то более сложное не врубаешься. Для начала сойдет. Если совсем будет туго, тогда будешь уже усовершенствованиями заниматься. > довольно большой эффективность видимо значительно снизится. Ничего , переживешь. Не миллионы же у тебя там. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2007, 10:27 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
Что выросло, то выросло(с) Собственно на скрепке что получается, только я не отлаживал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2007, 22:28 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
blindedЧто выросло, то выросло(с) Собственно на скрепке что получается, только я не отлаживал А в чём смысл константной функции-члена? Никогда с ними не сталкивался. void read_lock() const; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 10:55 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
blindedЧто выросло, то выросло(с) Собственно на скрепке что получается, только я не отлаживал Большое спасибо, за пример. Раньше не использовал семафоры. Попытаюсь разобраться. Только не совсем понятно почему не обойтись одним мьютексом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 11:30 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков.Варианты. 1) пайп 2) двойная буферизация 3) считывающий поток для обработки дублирует себе контейнер 4) пишущий поток может добавлять данные не по одному, а пачками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 12:19 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 blindedЧто выросло, то выросло(с) Собственно на скрепке что получается, только я не отлаживал А в чём смысл константной функции-члена? Никогда с ними не сталкивался. void read_lock() const; Ну это-то понятно, обычно методы которые читают const и чтобы каждый раз не писать mutable на замке сделано const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 12:20 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
maXmo OLEG_2005Программа должна иметь возможность опрашивать несколько подсистем сбора данных. Пока я понимаю только вариант с запретом нескольких потоков одновременно обращаться к контейнеру с помощью мьютекса или критических секций. Но тогда при обходе контейнера не будет возможности обращаться к нему другим потоком. Хотя может быть по другому не сделаешь. В этом случае в контейнер могут писать несколько потоков.Варианты. 1) пайп 2) двойная буферизация 3) считывающий поток для обработки дублирует себе контейнер 4) пишущий поток может добавлять данные не по одному, а пачками. А можно пояснить первые два вариант, что вы под ними подразумеваете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 14:56 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь. 2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 16:45 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
в первом случае свой протокол надо делать если у тебя нефиксированный размер структуры или в чём ты там инфу передаёшь… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 16:48 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
maXmo1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь. Ну уж ежели делать то не pipe. а publish-subscribe. ээто когда специальный поток мультиплексирует входную очередь сообщений на множество потребителей. maXmo2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем. Ну чего уж мелочитьсяю Пусть некоторый поток проецирует входные сообщения на модель и с некоторй частотой делает с этой модели мгновенную копию и публикует ее, все кому охота отображать - берет копию и чего-то с ней делает, потом хватает новую. Главное чтобы копия оставалась readonly ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 18:08 |
|
||
|
контейнеры STL и многопоточность
|
|||
|---|---|---|---|
|
#18+
maXmo1) как работает пайп: один поток туда пишет, другой читает и всё пучком. Недостаток – надо делать свой протокол :) По сути – нетипизированная потокобезопасная очередь. 2) что такое двойная буферизация: это использование двух буферов. Два контейнера – в один пишем (в одном потоке), из другого читаем (в другом), ждём, когда созреет второй контейнер, меняем. Все-таки не понятно насчёт пайпа. Один поток пишет в контейнер, другой читает. Т.е. читающие или пишуще потоки монопольно захватывают контейнер или в чём фокус? А в методе двойной буферизации надо как заполняются буфера для записи и для чтения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2007, 10:08 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34568248&tid=2028679]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 521ms |

| 0 / 0 |
