Advertisement
Gistrec

Mutex c++ example

Nov 7th, 2018
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3.  
  4. #define THREADCOUNT 2
  5.  
  6. HANDLE mutex;
  7.  
  8. DWORD WINAPI WriteToDatabase(LPVOID);
  9.  
  10. int main(void) {
  11.     setlocale(LC_ALL, "RUSSIAN");
  12.  
  13.     HANDLE threads[THREADCOUNT];
  14.     DWORD threadID;
  15.     int i;
  16.  
  17.     // Создаем мьютекс без начального владельца
  18.     mutex = CreateMutex(
  19.         NULL,              // Структура, которая определяет безопасность (NULL - по умолчанию)
  20.         FALSE,             // Нет начального вледльца
  21.         NULL);             // Имя мьютекста
  22.  
  23.     if (mutex == NULL) {
  24.         std::cerr << "Не удалось создать мьютекс: " << (int) GetLastError() << std::endl;;
  25.         return 1;
  26.     }
  27.  
  28.     // Создаем потоки
  29.     for (i = 0; i < THREADCOUNT; i++) {
  30.         threads[i] = CreateThread(
  31.             NULL,       // Структура, которая определяет безопасность (NULL - по умолчанию)
  32.             0,          // Размер стека (0 - стандартное значение)
  33.             (LPTHREAD_START_ROUTINE)WriteToDatabase, // Указатель на фунцию, которая выполнится в потоке
  34.             NULL,       // Аргументы функции
  35.             0,          // Флаги, которые управляют созданием потока.
  36.             &threadID); // Указатель на переменную, в которую передастся номер потока
  37.  
  38.         // Если поток не создался
  39.         if (threads[i] == NULL) {
  40.             std::cerr << "Не удалось создать поток: " << (int) GetLastError() << std::endl;
  41.             return 1;
  42.         }
  43.         std::cout << "Создан поток " << (int)threadID << std::endl;
  44.     }
  45.  
  46.     // Ждем пока все потоки завершат свою работу
  47.     WaitForMultipleObjects(THREADCOUNT, threads, TRUE, INFINITE);
  48.  
  49.     // Уничтожаем потоки
  50.     for (i = 0; i < THREADCOUNT; i++) {
  51.         CloseHandle(threads[i]);
  52.     }
  53.  
  54.     // Уничтожаем мьютекс
  55.     CloseHandle(mutex);
  56.  
  57.     system("pause");
  58.     return 0;
  59. }
  60.  
  61. DWORD WINAPI WriteToDatabase(LPVOID lpParam) {
  62.     // lpParam not used in this example
  63.     UNREFERENCED_PARAMETER(lpParam);
  64.  
  65.     DWORD waitResult;
  66.  
  67.     // Блокируем мьютекс
  68.     waitResult = WaitForSingleObject(
  69.         mutex,    // Мьютекс
  70.         INFINITE);  // Бесконечное время блокировки
  71.  
  72.     switch (waitResult) {
  73.         // Мьютекс
  74.         case WAIT_OBJECT_0:
  75.             __try {
  76.                 // Выполняем функцию
  77.                 std::cout << "Выполняется функция в потоке " << GetCurrentThreadId() << std::endl;
  78.             }
  79.  
  80.             __finally {
  81.                 // Освобождаем сокет
  82.                 if (!ReleaseMutex(mutex)) {
  83.                     std::cerr << "Ошибка при освобождении мьютекса" << std::endl;
  84.                 }
  85.             }
  86.             break;
  87.  
  88.             // The thread got ownership of an abandoned mutex
  89.             // The database is in an indeterminate state
  90.         case WAIT_ABANDONED:
  91.             return FALSE;
  92.  
  93.     }
  94.     return TRUE;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement