![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
вот весь код чтобы любой мог проверить:
using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; namespace lab3_Pro { class lab3_Csharp { static int N=8; static int P=4; static int H=N/P; static int [,]MB=new int[N,N]; static int [,]MO=new int[N,N]; static int [,]MT=new int[N,N]; static int [,]MR=new int[N,N]; static int B; static int a; static int [,]MA=new int[N,N]; static int i,j; static object CrSec=new object(); //CREATE OF CRITICAL SECTIONS static Semaphore SEM = new Semaphore(0,3);//CREATE OF SEMAFORS static Mutex MUT = new Mutex(false); //AND MUTEX static EventWaitHandle EV2 = new ManualResetEvent(false); static EventWaitHandle EV3 = new ManualResetEvent(false); static EventWaitHandle EV4 = new ManualResetEvent(false); public static void Thread_FIRST(){ Console.WriteLine("Thread 1 started\n"); int[,] MQ = new int[N, N]; int[,] MT1 = new int[N, N]; int[,] MR1 = new int[N, N]; ; int[,] MO = new int[N, N]; int B1; int a1; EV2.WaitOne(); EV3.WaitOne(); EV4.WaitOne(); lock (CrSec) { // вхід в критичну секцію for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { MT1[i,j] = MT[i,j]; MR1[i,j] = MR[i,j]; } } } // вихід з критичої секції //MOh*MT1 for(i=0; i<H; i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ MQ[i,j]=MQ[i,j]+MT1[i,k]*MO[j,k]; } } } //MA=(MR*MQh) for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ //MA[i,j]+=MQ[i,k]*MR1[k,j]; } //printf("%d",MA[i][j]); } //printf("\n"); } MUT.WaitOne(); //захоплення процессом мютекса B1=B; a1=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=0;i<H;i++){ for(j=0; j<N; j++){ MA[i,j]=(B1 * MA[i,j]); } } //a1*MBh for(i=0;i<H;i++){ for(j=0;j<N;j++){ MB[i,j]=a1*MB[i,j]; } } for(i=0;i<H;i++){ for(j=0;j<N;j++){ MA[i,j]=MA[i,j]+MB[i,j]; } } SEM.WaitOne(); SEM.WaitOne(); SEM.WaitOne(); //output data Console.Write("\nOutput:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++){ Console.WriteLine(" %3d ",MA[i,j]); } Console.WriteLine("\n"); } Console.Write("Thread 1 finished\n"); } //----------------------------------------------------------------------------------------------------------- public static void Thread_SECOND(){ Console.Write("Thread 2 started\n"); int[,] MQ = new int[N, N]; int[,] MT2 = new int[N, N]; int [,]MR2 = new int[N, N]; int[,] MO = new int[N, N]; int B2; int a2; for(i=0;i<N;i++){ for(j=0;j<N;j++){ MB[i,j]=1; } } EV2.Set(); EV3.WaitOne(); EV4.WaitOne(); lock (CrSec) {// вхід в критичну секцію for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { MT2[i,j] = MT[i,j]; MR2[i,j] = MR[i,j]; } } } // вихід з критичої секції //MQ=MOh*MT1 for(i=H;i<H*2;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ //MQ[i,j]+=MO[i,k]*MT2[j,k]; } } } //MA=MQ*MRh for(i=H;i<2*H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ MA[i,j]+=MQ[i,k]*MR2[k,j]; } } } MUT.WaitOne(); //захоплення процессом мютекса B2=B; a2=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=H;i<H*2;i++){ for(j=0; j<N; j++){ MA[i,j]=(B2 * MA[i,j]); } } //a1*MBh for(i=0;i<H*2;i++){ for(j=0;j<N;j++){ MB[i,j]=a2*MB[i,j]; } } for(i=H;i<H*2;i++){ for(j=0;j<N;j++){ MA[i,j]+=MB[i,j]; } } SEM.Release(); Console.Write("Thread 2 finished\n"); } |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
//вторая часть, идет в одном файле, это продолжение.
//----------------------------------------------------------------------------------------------------------- public static void Thread_THRID(){ Console.WriteLine("Thread 3 started\n"); int[,] MQ = new int[N, N]; int[,] MT3 = new int[N, N]; int[,] MR3 = new int[N, N]; int[,] MO = new int[N, N]; int B3; int a3; for(i=0;i<N;i++){ for(j=0;j<N;j++){ MO[i,j]=1; } } a=1; B=1; EV3.Set(); EV2.WaitOne(); EV4.WaitOne(); lock(CrSec){ // вхід в критичну секцію for(i=0;i<N;i++){ for(j=0;j<N;j++){ MT3[i,j]=MT[i,j]; MR3[i,j]=MR[i,j]; } } } // вихід з критичої секції //MQ=MOh*MT1 for(i=H*2;i<H*3;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ //MQ[i,j]+=MT3[i,k]*MO[j,k]; } } } //MA=MQ*MRh for(i=H*2;i<3*H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ //MA[i,j]+=MQ[i,k]*MR3[k,j]; } } } MUT.WaitOne(); //захоплення процессом мютекса B3=B; a3=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=H*2;i<H*3;i++){ for(j=0; j<N; j++){ MA[i,j]=B3*MA[i,j]; } } //a1*MBh for(i=H*2;i<H*3;i++){ for(j=0;j<N;j++){ MB[i,j]=a3*MB[i,j]; } } for(i=H*2;i<H*3;i++){ for(j=0;j<N;j++){ MA[i,j]+=MB[i,j]; } } SEM.Release(); Console.Write ("Thread 3 finished\n"); } //--------------------------------------------------------------------------------------------------- public static void Thread_FOUR(){ Console.Write("Thread 4 started\n"); int[,] MQ = new int[N, N]; int[,] MT4 = new int[N, N]; int[,] MR4 = new int[N, N]; ; int[,] MO = new int[N, N]; int B4; int a4; for(i=0;i<N;i++){ for(j=0;j<N;j++){ MT[i,j]=1; MR[i,j]=1; } } EV4.Set(); EV2.WaitOne(); EV3.WaitOne(); lock (CrSec) { // вхід в критичну секцію for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { MT4[i, j] = MT[i, j]; MR4[i, j] = MR[i, j]; } } } // вихід з критичої секції //MQ=MOh*MT1 for(i=H*3;i<H*4;i++){ for(j=0;j<N;j++){ MQ[i,j]=0; for(int k=0;k<N;k++){ MQ[i,j]+=MT4[i,k]*MO[j,k]; } } } //MA=MQ*MRh for(i=H*3;i<4*H;i++){ for(j=0;j<N;j++){ MA[i,j]=0; for(int k=0;k<N;k++){ MA[i,j]+=MQ[i,k]*MR4[k,j]; } } } MUT.WaitOne(); //захоплення процессом мютекса B4=B; a4=a; MUT.ReleaseMutex(); //звільнення процессом мютекса //Bh*(MO*MT1*MR) for(i=H*3;i<H*4;i++){ for(j=0; j<N; j++){ MA[i,j]=(B4*MA[i,j]); } } //a4*MBh for(i=H*2;i<H*3;i++){ for(j=0;j<N;j++){ MB[i,j]=a4*MB[i,j]; } } for(i=H*3;i<H*4;i++){ for(j=0;j<N;j++){ MA[i,j]+=MB[i,j]; } } SEM.Release(); Console.Write("Thread 4 finished\n"); } static void Main() { new Thread(Thread_FIRST).Start(); new Thread(Thread_SECOND).Start(); new Thread(Thread_THRID).Start(); new Thread(Thread_FOUR).Start(); } } } самое интересное, действительно, да индекс выходит за границы, но ведь и причин для этого кажется не давал. |
![]() |
![]() |
#13 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
народ, мне кажется все дело в обьявлении глобальной переменнной i,j, если его убрать и в каждом цикле поставить int тогда никаких проблем не будет. но тогда это будет говнокодерский код, уж извините за выражение. такое решение многопоточной программы меня не устроит...
|
![]() |
![]() |
#14 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
![]()
potap88, оО'' каким образом из-за устранения глобальных переменных код превратится в говнокодерский?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
![]() |
![]() |
#15 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 18.12.2009
Сообщений: 16
|
![]()
уже разобрался.глобальная переменная не сработает,так как у нас паралельный алгоритм, и 4процесса обращаются к одним и тем же переменным. алгоритм срабатывает при локальных переменных. Тогда, господа-программисты, вопрос: если глобальная переменная не срабатывает в Сшарпе, тогда почему С++ с этим прекрасно справляетсЯ?
|
![]() |
![]() |
#17 |
Участник клуба
Регистрация: 29.12.2009
Сообщений: 1,166
|
![]()
В С++ компилятор оптимизирует твой алгоритм, т.е. удаляет ненужные объявления или заменяет неудачные конструкции на более правильные
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть] |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. | Каравай | Microsoft Office Excel | 13 | 17.02.2010 09:53 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder | AleksP | C++ Builder | 7 | 11.04.2009 13:06 |
Сортировка массива способом Шелла "степени двойки" | xxxPascalxxx | Помощь студентам | 2 | 15.11.2008 21:58 |