Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 18.04.2010, 01:30   #11
potap88
Пользователь
 
Регистрация: 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");
}
potap88 вне форума
Старый 18.04.2010, 01:31   #12
potap88
Пользователь
 
Регистрация: 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();

}
}

}

самое интересное, действительно, да индекс выходит за границы, но ведь и причин для этого кажется не давал.
potap88 вне форума
Старый 18.04.2010, 12:47   #13
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

народ, мне кажется все дело в обьявлении глобальной переменнной i,j, если его убрать и в каждом цикле поставить int тогда никаких проблем не будет. но тогда это будет говнокодерский код, уж извините за выражение. такое решение многопоточной программы меня не устроит...
potap88 вне форума
Старый 18.04.2010, 14:46   #14
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

potap88, оО'' каким образом из-за устранения глобальных переменных код превратится в говнокодерский?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума
Старый 18.04.2010, 15:25   #15
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
potap88, оО'' каким образом из-за устранения глобальных переменных код превратится в говнокодерский?
неудобно в каждом цикле писать каждый раз int. а если будет 20потоков и глобальная переменная не срабатывает? не идти же напролом и ставить инт инт инт.
potap88 вне форума
Старый 18.04.2010, 15:37   #16
potap88
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 16
По умолчанию

уже разобрался.глобальная переменная не сработает,так как у нас паралельный алгоритм, и 4процесса обращаются к одним и тем же переменным. алгоритм срабатывает при локальных переменных. Тогда, господа-программисты, вопрос: если глобальная переменная не срабатывает в Сшарпе, тогда почему С++ с этим прекрасно справляетсЯ?
potap88 вне форума
Старый 18.04.2010, 15:50   #17
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

В С++ компилятор оптимизирует твой алгоритм, т.е. удаляет ненужные объявления или заменяет неудачные конструкции на более правильные
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай 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