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

Two Threads + CriticalSection - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ головоломка для знающих... http://www.cyberforum.ru/cpp-beginners/thread333058.html
Описать функцию Ln1(x, ) вещественного типа (параметры x,  — вещественные, |x| < 1,  > 0), находящую приближенное значение функции ln(1 + x): ln(1 + x) = x – x2/2 + x3/3 – … + (–1)n•xn+1/(n+1) + … . В сумме учитывать все слагаемые, модуль которых больше . С помощью Ln1 найти приближенное значение ln(1 + x) для данного x при шести данных . :scratch:
C++ Значения матрицы найти 2 наибольших значения из четных столбцов и их индексы записать функцией http://www.cyberforum.ru/cpp-beginners/thread333026.html
C++ Получить из кода символ
Нужно как-то перегнать код символа (по таблице ASCII символов) в символ. Как это можно сделать? Допустим у меня есть строка string str1. Я хочу получить записать в неё символ с кодом 65, как это сделать? Вариант "запиши туда букву A и всё" не подойдёт так как программа будет писать символы по кодам и я заранее не знаю какой код будет, весь алфавит case'ом пробегать будет по быдлокодерски же....
C++ Различные приемы работы с матрицами - готовое решение
подрихтовал для матриц и массивов 2 с лишним часа жизни >_< #include <iostream> #include <time.h> using std::cout; using std::endl; using std::cin; void matrPrint ( int **, int, int ); void matrSortUp ( int **, int, int );
C++ Ответ на упражнение, которое я задал в другой теме про перевод диагональных координат в стандартные http://www.cyberforum.ru/cpp-beginners/thread332999.html
Всё просто довольно. Как и обещал, две строки. Чтобы не говорили, что я типа в кустах struct koordinati_ { int nomer_stroki; int nomer_stolbtsa; koordinati_ }; template <class T> bool matrix<T>::f_perevod_koordinat (koordinati_* koordinati, int y, int x) { koordinati->nomer_stroki= y- ((y- kol_vo_strok+ 1)+ abs(y- kol_vo_strok+ 1))/2- x;
C++ Вставить в строку s содержимое s1 начиная с позиции n Помогите пожалуйста написать программу! Вставить в строку s содержимое s1 начиная с позиции n. То есть сначала идут n-первых символов s, тогда символы s1, а дальше-те символы, которые были у s до вставки s1, начиная с позиции n. Это нужно сделать не используя библиотеки <string.h>, а создать собственную функцию Insert (s, s1, n) ... Заранее спасибо! подробнее

Показать сообщение отдельно
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.07.2011, 21:34     Two Threads + CriticalSection
Ты вообще зачем поток зациклил для демонстрации синхронизации мог просто цикл установить с фиксированным числом повторений, если нужно прервать поток на лету вызвать
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-ы они быстрее работают.
 
Текущее время: 18:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru