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

Семафоры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.80
lexatigr
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 76
02.01.2012, 15:33     Семафоры #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
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- Пример
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 15:33     Семафоры
Посмотрите здесь:

C++ Семафоры(7 потоков)
C++ Мьютексы, семафоры
C++ что такое семафоры?
C++ Объекты синхронизации. мьютексы, семафоры
Java SE Семафоры
Семафоры - можно ли считать ноль положительным числом? C++
Понятие синхронизации потоков и процессов. Семафоры и мьютексы C++
Потоки в windows и семафоры C++

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

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

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

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

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