Форум программистов, компьютерный форум CyberForum.ru

Two Threads + CriticalSection - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
goto
 Аватар для goto
76 / 34 / 4
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
14.07.2011, 18:49     Two Threads + CriticalSection #1
код...
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500
#include <windows.h>
 
//#pragma comment(lib, "Kernel32.lib")
 
DWORD ThreadTwoId = 0;
HANDLE ThreadTwoHandle = 0;
 
CRITICAL_SECTION GlobalDataCriticalSection;
float GlobalData[10] = {0,0,0,0,0,0,0,0,0,0};
 
 
 
DWORD ThreadTwo(LPVOID lpdwThreadParam) 
{
 
    while(1) 
    {
        EnterCriticalSection(&GlobalDataCriticalSection);
        // Потоку удалось получить доступ, изменим данные
        for (int i = 0; i < 5; i++)
        {
            GlobalData[i]+=0.00001f;
        };
        LeaveCriticalSection(&GlobalDataCriticalSection);
        //Sleep(1);
    }
    return EXIT_SUCCESS;
}
 
 
int main () 
{
    DWORD dwWaitResult = 0;
 
    InitializeCriticalSectionAndSpinCount(&GlobalDataCriticalSection, 0);
    
 
    ThreadTwoHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) &ThreadTwo, 0, 0, &ThreadTwoId );
 
    while(1) 
    {           
        EnterCriticalSection(&GlobalDataCriticalSection);
        // Потоку удалось получить доступ, изменим данные
        for (int i = 5; i < 10; i++)
        {
            GlobalData[i]-=0.00001f;
        };
            
        LeaveCriticalSection(&GlobalDataCriticalSection);
        if (GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) break;
        //Sleep(1);
    }
 
    SuspendThread(ThreadTwoHandle);
    DeleteCriticalSection(&GlobalDataCriticalSection);
 
    // Завершение программы
    CloseHandle(ThreadTwoHandle);
    ThreadTwoHandle = 0;
    ThreadTwoId = 0;
 
    // Выводим результат работы потоков
    printf("\n GlobalData \n { ");
    for (int i = 0; i < 10; i++)
    {
        printf(" %f ", GlobalData[i]);
    }
    printf(" }\n");
 
    getchar();
    return EXIT_SUCCESS;
}
вопросы.
1й. Как нужно завершать работу в потоках с критическими секциями?
пока я не добавил строку SuspendThread(ThreadTwoHandle); перед DeleteCriticalSection(...) вылетало исключение, причем не всякий раз, с чем это связанно?

2й. почему, сколько бы не работала программа. она начисляет переменным в массиве значения 256.0 и -256.0 соответственно, но ведь у меня нет ограничений по диапазону допустимых значений, в чем причина? printf некорректно выводит float?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 19:28     Two Threads + CriticalSection #2
Я что-то не понял. Ты по критической секции проверяешь, завершился ли поток? Критическая секция не для этого.
Ожидать завершение потока нужно функцией WaitForSingleObject, а уже потом удалять критическую секцию.

Добавлено через 3 минуты
Почему не просто InitializeCriticalSection?
goto
 Аватар для goto
76 / 34 / 4
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
14.07.2011, 19:56  [ТС]     Two Threads + CriticalSection #3
Deviaphan
Ты по критической секции проверяешь, завершился ли поток?
Нет, я не проверяю завершился ли он... и мне честно говоря все= что там с ним, первый поток завершает работу программы, а второй фигней страдает даже если его закрыли! И там вообще проверок 0 я просто не пойму почему через раз он исключение кидает если я его не заслиплю перед удалением секции... даже если я сначала сделаю CloseHandle(ThreadTwoHandle); а потом удаляю секцию... он исключение у себя в потоке кидает на EnterSection..., с чего бы это, если поток уже закрыт? И потом магическая цифра 256 и -256 откуда Оо, работала программа 1мин или 5мин там +-256 ???

Почему не просто InitializeCriticalSection?
хз, подумал букв у ф-ии больше умнее будет) один черт для сингл кор процов последний флаг вродь игнорицо. Я так понимаю последний флаг указывает на максимальное кол-во подряд идущих захватов одним потоком? После достижения данного кол-ва пока другой поток хоть раз не захватит секцию первому будет отказано так?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 20:03     Two Threads + CriticalSection #4
Ну а ты чего хотел, если удаляешь критическую секцию до завершения потока?
Сперва убей поток, а потом уже критическую секцию.
Объекты должны удаляться в порядке, обратном их созданию. По крайней мере такие.

Добавлено через 1 минуту
И я не уверен, что должно произойти, если ты убьёшь поток до выхода из критической секции.
Используй мьютекс или событие или хоть флаг для корректного завершения потока. Не надо так в наглую его прибивать.
goto
 Аватар для goto
76 / 34 / 4
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
14.07.2011, 20:12  [ТС]     Two Threads + CriticalSection #5
Сперва убей поток, а потом уже критическую секцию.
дык ага, но...
C++
1
2
3
4
        SuspendThread(ThreadTwoHandle);
        DeleteCriticalSection(&GlobalDataCriticalSection);
        // Завершение программы
        CloseHandle(ThreadTwoHandle);
так не кидает искл...

C++
1
2
3
4
5
6
7
8
    //SuspendThread(ThreadTwoHandle);
    
    // Завершение программы
    CloseHandle(ThreadTwoHandle);
    ThreadTwoHandle = 0;
    ThreadTwoId = 0;
 
    DeleteCriticalSection(&GlobalDataCriticalSection);
а так кидает...( если разкомментарим слип в последнем коде опять не кидает...
это где-то уже в стандарт возведено перед убийством потока его слипить, просто убить нельзя уже?

Не надо так в наглую его прибивать
ясно убивать нежно значит надо)

Используй мьютекс
уже поюзал все отлично работает с мютексами, решил поковырять секции (они вродь как разновидность мютексов только локальная в пределах процесса) оказались быстрее вроде, но вот проблемы обнаружились(
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 20:14     Two Threads + CriticalSection #6
Значит, удаление происходит до того, как поток убит... Сделай культурное завершение потока и будет тебе счастье.
С читерским завершением ты с освобождением ресурсов запаришься потом.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.07.2011, 21:34     Two Threads + CriticalSection #7
Ты вообще зачем поток зациклил для демонстрации синхронизации мог просто цикл установить с фиксированным числом повторений, если нужно прервать поток на лету вызвать
GetExitCodeThread(thread, &id) или ExitThread(0) только когда цикл потока будет прерван или вызвать функцию TerminateThread(thread, 0); сразу завершит поток, SuspendThread - это остановка потока а не завершение.

Вот пример тебе, для лучшего понимания критической секции, где два потока основной и созданный пишут в консоль по очереди, убрав критическую секцию они вместе будут одновременно писать в консоль.
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <windows.h>
 
CRITICAL_SECTION    section; 
bool signal = false;
 
DWORD  __stdcall   Thread(LPVOID  param) {
     EnterCriticalSection(&section);  // вот начала доступа к консоли метим код крит-секцией
     DWORD  dw;
     COORD  pos = { 0, 0 };
     TCHAR  str[128];
     for(int  cycle = 0; cycle < 20; cycle++) {
          pos.Y = cycle;
          SYSTEMTIME  tm;
          GetLocalTime(&tm);
          wsprintf(str, "%d). thread-2. millisec: %d\n", cycle + 1, tm.wMilliseconds);
          WriteConsoleOutputCharacter(param, str, lstrlen(str)-1, pos, &dw);
          if(signal)
               break;
          Sleep(100);
      }
      lstrcpy(str, "***THREAD-2, END***");  // показать завершение
      pos.Y++;
      WriteConsoleOutputCharacter(param, str, lstrlen(str)-1, pos, &dw);
      LeaveCriticalSection(&section);  // отпускаем
      ExitThread(0U);
      return 0;
}
 
 
void  main(void) {
 
    InitializeCriticalSection(&section);
 
    HANDLE  hout    = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD   id;
    HANDLE  thread = CreateThread(NULL, 0U, Thread, hout, THREAD_PRIORITY_NORMAL, &id); 
 
    EnterCriticalSection(&section);   // метка код крит-секцией заберём
    DWORD  dw;
    COORD   pos = { 40, 0 };
    TCHAR  str[128];
    for(int  cycle = 0; cycle < 20; cycle++) {
         pos.Y = cycle;
         SYSTEMTIME  tm;
         GetLocalTime(&tm);
         wsprintf(str, "%d). thread-1. millisec: %d\n", cycle + 1, tm.wMilliseconds);
         WriteConsoleOutputCharacter(hout, str, lstrlen(str)-1, pos, &dw);
         Sleep(100);
    }
    lstrcpy(str, "***THREAD-1, END***");  
    pos.Y++;
    WriteConsoleOutputCharacter(hout, str, lstrlen(str)-1, pos, &dw);
    LeaveCriticalSection(&section);  // отпустим
    
    // при нажатие ESCAPE выйти
    while(!(GetAsyncKeyState(VK_ESCAPE) & 0x8000));
 
    signal = true;  // прервём поток для завершения, если он выполнялся ещё
    Sleep(100u);   // подождём потому-что в потоке тоже sleep
 
    DeleteCriticalSection(&section);   // по-завершению удаляем крит-секцию
    CloseHandle(thread);               
 
  getchar();
}
:cofee: лучше использовать mutex-ы они быстрее работают.
goto
 Аватар для goto
76 / 34 / 4
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
14.07.2011, 23:16  [ТС]     Two Threads + CriticalSection #8
лучше использовать mutex-ы они быстрее работают
у меня почему-то с точность да наоборот... причем разница в разы! (если брать одно и тоже время работы и смотреть на значения GlobalData, вариант с секций в разы быстрее) это я думаю объясняется тем что мютекс, - уровень ядра винды - отсюда тормоза, а секция локальная фича процесса, и ядро не задействуется либо если и юзается то в особом случае. По крайней мере из моих ковыряний я сделал именно такие выводы.

добавил культурное само убийство потока... по глобальному флагу... с новой крит. секцией для флага.
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500
#include <windows.h>
 
DWORD ThreadTwoId = 0;
HANDLE ThreadTwoHandle = 0;
 
CRITICAL_SECTION GlobalDataCriticalSection;
float GlobalData[10] = {0,0,0,0,0,0,0,0,0,0};
 
CRITICAL_SECTION GlobalTerminateCriticalSection;
bool GlobalTerminate = false;
 
DWORD ThreadTwo(LPVOID lpdwThreadParam) 
{
    bool run = true;
 
    while(run) 
    {
        EnterCriticalSection(&GlobalDataCriticalSection);
        // Потоку удалось получить доступ, изменим данные
        for (int i = 0; i < 5; i++)
        {
            GlobalData[i]+=0.00001f;
        };
        LeaveCriticalSection(&GlobalDataCriticalSection);
 
        // Посмотрим вдруг потоку надо убить-ся?
        EnterCriticalSection(&GlobalTerminateCriticalSection);
        if ( GlobalTerminate ) run = false;
        LeaveCriticalSection(&GlobalTerminateCriticalSection);
 
        //Sleep(1);
    }
    return EXIT_SUCCESS;
}
 
 
int main () 
{
    DWORD dwWaitResult = 0;
 
    InitializeCriticalSection(&GlobalDataCriticalSection);
    InitializeCriticalSection(&GlobalTerminateCriticalSection);
    
 
    ThreadTwoHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) &ThreadTwo, 0, 0, &ThreadTwoId );
 
    while(1) 
    {           
        EnterCriticalSection(&GlobalDataCriticalSection);
        // Потоку удалось получить доступ, изменим данные
        for (int i = 5; i < 10; i++)
        {
            GlobalData[i]-=0.00001f;
        };
        LeaveCriticalSection(&GlobalDataCriticalSection);
 
        if (GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) 
        {
            EnterCriticalSection(&GlobalTerminateCriticalSection);
            GlobalTerminate = true;
            LeaveCriticalSection(&GlobalTerminateCriticalSection);
            break;
        }
        //Sleep(1);
    }
 
    // Ждем пока скончается второй поток... долго ждем
    WaitForSingleObject(ThreadTwoHandle, INFINITE);
    //SuspendThread(ThreadTwoHandle);
    
    // Завершение программы
    CloseHandle(ThreadTwoHandle);
    DeleteCriticalSection(&GlobalDataCriticalSection);
 
 
    // Выводим результат работы потоков
    printf("\n GlobalData \n { ");
    for (int i = 0; i < 10; i++)
    {
        printf(" %f ", GlobalData[i]);
    }
    printf(" }\n");
 
    getchar();
    return EXIT_SUCCESS;
}
Добавлено через 46 минут
вариант с мютексами
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
DWORD ThreadTwoId = 0;
HANDLE ThreadTwoHandle = 0;
 
HANDLE GlobalDataMutex = 0;
float GlobalData[10] = {0,0,0,0,0,0,0,0,0,0};
 
HANDLE GlobalTerminateMutex = 0;
bool GlobalTerminate = false;
 
 
 
DWORD ThreadTwo(LPVOID lpdwThreadParam) 
{
    DWORD dwWaitResult = 0; 
    bool run = true;
 
    while(run) 
    {
        
        // первый мютекс для глобального флага GlobalTerminate
        if  (WAIT_OBJECT_0 == (dwWaitResult = WaitForSingleObject(GlobalTerminateMutex, 0))) 
        {
            // Убиться потоку?
            if (GlobalTerminate) run = false;
            ReleaseMutex(GlobalTerminateMutex);
        }
 
        
        // второй мютекс для данных разделяемых обоими потоками... 
        // в некоторый момент времени только один имеет к нему доступ
        dwWaitResult = WaitForSingleObject(GlobalDataMutex, 0);
 
        switch(dwWaitResult) 
        {
        case WAIT_OBJECT_0:
            {
                // Потоку удалось получить доступ, изменим данные
                for (int i = 0; i < 5; i++)
                {
                    GlobalData[i]+=0.00001;
                }
                // Освободим для другого потока
                ReleaseMutex(GlobalDataMutex); 
            
                break;
            }
        case WAIT_ABANDONED:
            // Потоку не удалось получить доступ
            
            break;
 
        }   
    }
 
    return EXIT_SUCCESS;
}
 
 
int main () 
{
    DWORD dwWaitResult = 0;
 
    ThreadTwoHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) &ThreadTwo, 0, 0, &ThreadTwoId );
 
    GlobalDataMutex = CreateMutex(NULL, FALSE, NULL);
    GlobalTerminateMutex = CreateMutex(NULL, FALSE, NULL);
 
 
    while(1) 
    {
        
        dwWaitResult = WaitForSingleObject(GlobalDataMutex, 0);
 
        switch(dwWaitResult) 
        {
        case WAIT_OBJECT_0:
            {
                // Потоку удалось получить доступ, изменим данные
                for (int i = 5; i < 10; i++)
                {
                    GlobalData[i]-=0.00001;
                }
                // Освободим для другого потока
                ReleaseMutex(GlobalDataMutex);             
                break;
            }
        case WAIT_ABANDONED:
            // Потоку не удалось получить доступ            
            break;
        }
        //Sleep(1);
 
        if (GetAsyncKeyState(VK_ESCAPE) & 0x8000 ) //выходи по нажанию Esc
        { 
            // Ждем освобождения GlobalTerminateMutex ...вечно ждем... 
            if  (WAIT_OBJECT_0 == (dwWaitResult = WaitForSingleObject(GlobalTerminateMutex, INFINITE))) 
            {
                // Изменим
                GlobalTerminate = true;
                // Переключим мютекс в свободный... другой поток может опрашивать GlobalTerminate
                ReleaseMutex(GlobalTerminateMutex);
            }
 
            break; // выходим из While(1)
        }
    }
 
    // Завершение программы
    // Второй поток закончится пойдем ниже
    WaitForSingleObject(ThreadTwoHandle, INFINITE);
 
    // закрываем мютексы
    CloseHandle(GlobalDataMutex);
    CloseHandle(GlobalTerminateMutex);
    // закрываем поток
    CloseHandle(ThreadTwoHandle);
 
    // Выводим результат работы потоков
    printf("\n GlobalData \n { ");
    for (int i = 0; i < 10; i++)
    {
        printf(" %.2f ", GlobalData[i]);
    }
    printf(" }\n");
 
    getchar();
    return EXIT_SUCCESS;
}
вопрос. насколько уместно оборачивать мелкие переменные в мютексы/крит секции? если допустим мне понадобиться 20 разных переменных которые разделяют потоки, мне что каждую из них оборачивать в вывоз мютекса или EnterCriticalSection/LeaveCriticalSection ? Либо же атомарные не динамические данные никто не оборачивает, а юзают что назыв. в лоб?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 06:11     Two Threads + CriticalSection #9
Для атомарных данных есть атомарные операции.
Проблема с кучей переменных решается их правильной организацией или перепроектированием приложения.

P.S. Критическая секция быстрее мьютекса.
schdub
 Аватар для schdub
2901 / 1245 / 222
Регистрация: 19.01.2009
Сообщений: 3,210
Завершенные тесты: 1
15.07.2011, 10:07     Two Threads + CriticalSection #10
Цитата Сообщение от goto Посмотреть сообщение
если допустим мне понадобиться 20 разных переменных которые разделяют потоки, мне что каждую из них оборачивать в вывоз мютекса или EnterCriticalSection/LeaveCriticalSection
Если нужно шарить LONG переменную, например, то в WinAPI есть целый подкласс функций для потокобезопасной работы с ними:
Код
InterlockedCompareExchange
InterlockedDecrement
InterlockedExchange
InterlockedExchangeAdd
InterlockedIncrement
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 10:45     Two Threads + CriticalSection #11
Только учти, что потоко-безопасно можно выполнять только эти операции. Т.е. выполнить сравнение потоко-безопасно, без блокировки, у тебя уже не получится.
goto
 Аватар для goto
76 / 34 / 4
Регистрация: 04.04.2011
Сообщений: 78
Записей в блоге: 1
15.07.2011, 12:42  [ТС]     Two Threads + CriticalSection #12
schdub
в WinAPI есть целый подкласс функций для потокобезопасной работы
да, я уже подглядел на мсдн как они там потоко-безопасно сравнивают...
C++
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
...   
static bool UseResource()
   {
 
      //0 indicates that the method is not in use.
      if ( 0 == Interlocked::Exchange( usingResource, 1 ) )
      {
         Console::WriteLine( " {0} acquired the lock", Thread::CurrentThread->Name );
 
         //Code to access a resource that is not thread safe would go here.
         //Simulate some work
         Thread::Sleep( 500 );
         Console::WriteLine( " {0} exiting lock", Thread::CurrentThread->Name );
 
         //Release the lock
         Interlocked::Exchange( usingResource, 0 );
         return true;
      }
      else
      {
         Console::WriteLine( " {0} was denied the lock", Thread::CurrentThread->Name );
         return false;
      }
   }
...
Deviaphan
Проблема с кучей переменных решается их правильной организацией или перепроектированием приложения.
видимо так, что-то типа флаг(и) разрешения для групп переменных, поочередная работа потоков с данными, исполнение N- дочернего потока по запросу родительского.

Вопрос.

1й. можно ли разделить участок памяти между потоками, что бы они работали одновременно, каждый над своим участком? Мне кажется можно, надо лишь что бы они не писали и не читали из одного и того же участка одновременно, я прав? Завести, скажем, одну крит. секцию на некоторый участок памяти 1024байта 1ч = 0-512байт 2ч = 512-1024байт... и если поток не может получить доступ к крит. Секции = 1ч значит он может работать с другой 2-й частью памяти, и наоборот. Так наверное можно получить буст в вычислениях на мульти кор процах, или система и один поток распределит на ядра?

2й. Как отвести второму потоку скажем 10% процессорного времени?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2011, 13:11     Two Threads + CriticalSection
Еще ссылки по теме:

C++ Threads
CriticalSection Delphi Delphi
Сканирование компьютеров на присутствие в сети онлайн. #threads #c++11 #ping #icmp C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.07.2011, 13:11     Two Threads + CriticalSection #13
Цитата Сообщение от goto Посмотреть сообщение
2й. Как отвести второму потоку скажем 10% процессорного времени?
Никак.) Можно задать меньший приоритет, но в процентах... невозможно. По крайней мере в Вин.

Добавлено через 3 минуты
Цитата Сообщение от goto Посмотреть сообщение
1й. можно ли разделить участок памяти между потоками
Как я уже сказал, вопрос в организации данных.
Ни что не мешает тебе создать интерфейс, для получения безопасного диапазона адресов (примерно так же с файлами блокировка происходит). Т.е. ты запрашиваешь, например, диапазон с 100 до 150 элемента. Функция выполняет блокировку, проверяет допустимость диапазона, блокирует его (не мьютексами, а просто в списке используемых диапазонов), снимает блокировку и возвращает указатели или просто флаг того, что диапазон доступен. Это так, что сразу в голову пришло. Если подумать, можно неплохо развить индею.
Yandex
Объявления
15.07.2011, 13:11     Two Threads + CriticalSection
Ответ Создать тему
Опции темы

Текущее время: 17:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru