Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
lexatigr
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 76
1

Семафоры

02.01.2012, 15:33. Просмотров 3072. Ответов 2
Метки нет (Все метки)

Помогите решить задачу.
Есть пример, но делаю по аналогии не получается.
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
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <math.h>
 
using namespace std;
 
const char* GetErrorMessage() {
  char *error_message;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &error_message, 0, NULL);
  return error_message;
}
////////
HANDLE Empty, Full, Mutex;
int *A, nA=0, x=0,index=0, result=0;
double p=1;
////////
 
DWORD WINAPI ThreadFunc0(LPVOID) {
   for (int i=0; i<nA; i++) {
            WaitForSingleobject(Empty, INFINITE);
            WaitForSinglebject(Mutex, INFINITE);
            index=i;
            if (i!=0) p=pow(x, index);
            else p=1;
            ReleaseSemaphore(Mutex, 1, 0);
            ReleaseSemaphore(Full, 1, 0);
        }
   return 0;
  }
 
 
 
DWORD WINAPI ThreadFunc1(LPVOID ) {
   While (index<nA-1) {
        WaitForSingleObject(Full, INFINITE);
        WaitForSingleObject(Mutex, INFINITE);
 
result+=(int)p*A[index];
 
        ReleaseSemaphore(Mutex, 1, 0);
        ReleaseSemaphore(Empty, 1, 0);
   }
    return 0;
}
 
 int main(int argc, char* argv[]) {
    Empty = CreateSemaphore(0, 1, 1, 0);
    if (Empty == NULL) { cerr << GetErrorMessage(); return 1; };
 
    Full = CreateSemaphore(0, 0, 1, 0);
    if (Full == NULL) { cerr << GetErrorMessage(); return 1; };
 
    Mutex = CreateSemaphore(0, 1, 1, 0);
    if (Mutex == NULL) { cerr << GetErrorMessage(); return 1; };
 
 
  DWORD ThreadId[2];
  HANDLE Thread[2];
 
    srand(time(0));
    cout<<"Vvedite kol-vo coefficientov mnogochlena: " ; cin>>nA;
    cout<<"Mnogochlen: ";
    A=new int[nA];
    for (int i=0; i<nA; ++i) {
        A[i]=rand()%100;
    }
    for (int i=0; i<nA; ++i) {
        cout<<A[i]<<" * x^"<<i; if (i==nA-1) cout<<" = 0"; else cout<<" + ";
    }
    cout<<endl<<"Vvedite X: "; cin>>x;
    cout<<"Result: ";
    for (int i=0; i<nA; ++i) {
        cout<<A[i]<<" * "<<x<<"^"<<i; if (i!=nA-1) cout<<" + ";
    }
    cout<<" = ";
    Thread[0]=CreateThread(0, 0, ThreadFunc0, 0, 0, &ThreadId[0]);
    if (Thread[0] == NULL) { cerr << GetErrorMessage(); return 1; };
 
    Thread[1]=CreateThread(0, 0, ThreadFunc1, 0, 0, &ThreadId[1]);
    if (Thread[1] == NULL) { cerr << GetErrorMessage(); return 1; };
 
    WaitForMultipleObjects(2, Thread, 1, INFINITE);
    CloseHandle(Thread[0]); CloseHandle(Thread[1]);
    CloseHandle(Empty); CloseHandle(Full); CloseHandle(Mutex);
    cout<<(int)result<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
http://www.cyberforum.ru/attachment....6&d=1325501859- Пример
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 15:33
Ответы с готовыми решениями:

Семафоры
Есть программа с разделением на потоки. Программа подсчитывает количество...

Семафоры
Здравствуйте. Как можно организовать синхронизацию двух программ, которые...

Семафоры(7 потоков)
Требуется создать программу которая будет создавать 7 потоков и в каждом...

Мьютексы, семафоры
Здравствуйте. Помогите пожалуйста, хочу найти примеры задач с использованием...

Потоки в windows и семафоры
Здравствуйте,помогите пожалуйста разобраться. Задание: Написать систему из...

2
Vladimir.
159 / 159 / 48
Регистрация: 24.11.2009
Сообщений: 375
03.01.2012, 01:00 2
Попробуйте написать задание. Уверен, это сильно упростит понимание того, что же вы хотите получить в итоге.

зы: судя по коду, у вас есть массив коэффициентов полинома и вы ищете значение оного при конкретном х??

зыы: обратите так же внимание, что гуру рекомендуют запускать трэды с помощью функций beginthread() beginthreadex() с предпочтением последней. //связано с потенциальными ошибками при использовании памяти и корректностью работы однопоточных библиотек.
0
lexatigr
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 76
03.01.2012, 01:04  [ТС] 3
Vladimir., спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2012, 01:04

Что такое семафоры?
сразу хочу показать ссылку...

Объекты синхронизации. мьютексы, семафоры
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные...

Семафоры для динамически созданных потоков
Помогите разобраться, я динамически создаю поток, который имеет общие...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru