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

Создать массив и открыть поочередный доступ одного потока к нему - C++

Восстановить пароль Регистрация
 
Wrong
Сообщений: n/a
02.06.2013, 17:55     Создать массив и открыть поочередный доступ одного потока к нему #1
Значит дано следующие задание: Создайте разделяемый ресурс в виде глобального массива типа int и обеспечьте при помощи семафоров, единовременный доступ к элементам массива только одного потока. Другие потоки должны дожидаться очереди для доступа к общему ресурсу.
И к нему дана следующая программа:
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
#include "stdafx.h"
#include "windows.h"
#include "process.h" 
 
HANDLE hSemaphore;
LONG cMax = 2;
 
void Test1(void *);
void Test2(void *);
void Test3(void *);
 
 
// The one and only application object
 
CWinApp theApp;
 
using namespace std;
 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
 
    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        nRetCode = 1;
    }
    else
    {
        
 
         hSemaphore = CreateSemaphore( 
    NULL,// нет атрибута
    cMax,// начальное состояние
    cMax,// максимальное состояние
    NULL// без имени
 );
 
 if (!hSemaphore == NULL) 
 {
    if (_beginthread(Test1,1024,NULL)==-1)
     printf ("Error begin thread \n");
 
    
    if (_beginthread(Test3,1024,NULL)==-1)
     printf ("Error begin thread \n");
 
    if (_beginthread(Test2,1024,NULL)==-1)
     printf ("Error begin thread \n");
 
    Sleep(100000);
    CloseHandle(hSemaphore);
 }
 else
 {
    printf("error create semaphore\n");}
 }
 
 
    return nRetCode;
}
 
 
void Test1(void *)
 {
 
    printf ("Test1 Running\n");
    DWORD dwWaitResult; 
 do
 {
    dwWaitResult = WaitForSingleObject( 
    hSemaphore,// указатель на семафор
    1// интерфал ожидания
    );
    printf ("Test 1 TIMEOUT\n");
 }while(dwWaitResult==WAIT_OBJECT_0);
 Sleep(1000);
 if (ReleaseSemaphore(       
  hSemaphore,// указатель на семафор
  1,// изменяет счетчик на 1
        NULL)
 )
printf(" ReleaseSemaphore Ok Test1\n");
_endthread();
}
 
void Test2(void *)
{
 DWORD dwWaitResult;
 printf ("Test2 Running\n");
 do
 {
  dwWaitResult = WaitForSingleObject(hSemaphore,1);
  printf("Test 2 TIMEOUT\n");
 }while(dwWaitResult==WAIT_OBJECT_0);
 Sleep(1000);
 if (ReleaseSemaphore(hSemaphore,1,NULL))
  printf("ReleaseSemaphore Ok Test2\n");
 _endthread();
}
 
void Test3(void *)
{
 printf ("Test3 Running\n");
 DWORD dwWaitResult; 
 do
 {
  dwWaitResult = WaitForSingleObject(hSemaphore,1);
  printf ("Test 3 TIMEOUT\n");
 }while(dwWaitResult==WAIT_OBJECT_0);
 Sleep(1000);
 if (ReleaseSemaphore(hSemaphore,1,NULL))
  printf (" ReleaseSemaphore Ok Test3\n");
 _endthread();
}
Надеюсь на помощь так как сам не смог понять каким способом надо ограничить доступ и где правильней разместить массив в программе ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 17:55     Создать массив и открыть поочередный доступ одного потока к нему
Посмотрите здесь:

как создать вектор из векторов и как потом к нему обращаться? C++
C++ можно ли создать такой именованый пейп , что по нему можно было передавать данные по сети?
Доступ из одного класса в другой C++
C++ Доступ одного класса к данным другого
C++ Вызывть метод одного потока из другого потока
Поочередный вывод на экран без задержки всей программы C++
Создать разное количество потоков с возможностью ожидания события из одного потока в другом C++
Потоки, static. Доступ к полю класса из другого потока C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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