11-08-2012, 02:05 PM
есть волновая система, сеть Петри.
в чем проблема: при n меньше 30 программа работает корректно. Когда больше - даже не входит в main ( не печатает "start..."). Решение простое - засунуть в потоки:
упустил когда читал этот момент и помогите дать точный ответ, почему главный процесс сразу впадает в режим ожидания с n>30 при явном вызове.
//Как я думаю: при компиляции создаются инструкции, что уже известно, допустим, 100 итераций по 9*X*Y*Z WaitForSingleObject и это глушит процесс при запуске. lowpoke:
код раз
Код:
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
[color=Red]#define n 100[/color]
class channel
{
double *buf;
int size;
HANDLE s,empty,full;
int countr, countw; // указатели для чтения и записи
public:
channel (int nn): size(nn)
{
buf = new double[nn];
countr=0; countw=0;
s=CreateSemaphore(NULL,1,1,NULL); // создание семафоров
empty=CreateSemaphore(NULL,nn,nn,NULL);
full = CreateSemaphore(NULL,0,nn,NULL);
}
void operator << (double d) // операция записи в канал
{
WaitForSingleObject(empty, INFINITE); // ожидание свободных мест
WaitForSingleObject(s, INFINITE);
buf[countw++]=d; // запись в очередь
if (countw==size) countw=0;
ReleaseSemaphore(s,1,NULL);
ReleaseSemaphore(full,1,NULL); // увеличение числа запи-сей
}
void operator >> (double& d) // операция чтения из канала
{
WaitForSingleObject(full, INFINITE); // ожидание данных
WaitForSingleObject(s, INFINITE);
d = buf[countr]; countr++; // чтение из циклической очереди
if (countr==size) countr = 0;
ReleaseSemaphore(s,1,NULL);
ReleaseSemaphore(empty,1,NULL); // увеличение числа свободных мест
}
};
channel *pc[9];
DWORD WINAPI mult(LPVOID)
{
int j;
double d1, d2;
for (j=0; j<n; j++)
{
*pc[5]>>d1; *pc[6]>>d2;
*pc[8]<<(d1*d2);
}
return 1;
}
DWORD WINAPI minus(LPVOID)
{
int j;
double d1, d2;
for (j=0; j<n; j++)
{
*pc[0]>>d1; *pc[1]>>d2;
*pc[4]<<(d1-d2);
}
return 1;
}
DWORD WINAPI cosin(LPVOID)
{
int j;
double d1;
for (j=0; j<n; j++)
{
*pc[4]>>d1;
*pc[7]<<cos(d1);
}
return 1;
}
DWORD WINAPI cosin2(LPVOID)
{
int j;
double d1;
for (j=0; j<n; j++)
{
*pc[3]>>d1;
*pc[6]<<cos(d1);
}
return 1;
}
DWORD WINAPI expo(LPVOID)
{
int j;
double d1;
for (j=0; j<n; j++)
{
*pc[2]>>d1;
*pc[5]<<exp(d1);
}
return 1;
}
void main()
{
cout<<"start...";
channel c[9]={9,9,9,9,9,9,9,9,9};
// инициализация каналов
int i;
for (i=0; i<9;i++) pc[i] = &c[i];
CreateThread(NULL,0,mult,0,0,NULL);
CreateThread(NULL,0,minus,0,0,NULL);
CreateThread(NULL,0,cosin,0,0,NULL);
CreateThread(NULL,0,cosin2,0,0,NULL);
CreateThread(NULL,0,expo,0,0,NULL);
double u,v;
[color=red]for (i=0; i<n; i++)[/color]
{
u=i; v=1-i;
c[0]<<u; c[1]<<v;
c[2]<<u; c[3]<<v;
}
double x,y;
[color=red]for (i=0; i<n; i++)[/color]
{
q[7]>>x; q[8]>>y;
cout<<"\nx == "<<x; // чтение и вывод результатов
cout<<" == ";
cout<<(double)(cos(i+i-1)) ; // сравнение со значениями исходных формул
cout<<" y == "<<y<<" == "<<(double)(exp(i)*cos(1-i));
}
return 1;
cout<<"\n";
}
код два
Код:
DWORD WINAPI write(LPVOID g)
{
channel *q = (channel *)g;
int j;
double u,v;
for (j=0; j<n; j++)
{
u=j; v=1-j;
q[0]<<u; q[1]<<v;
q[2]<<u; q[3]<<v;
}
return 1;
}
DWORD WINAPI read(LPVOID g)
{
channel *q = (channel *)g;
double x,y;
for (int i=0; i<n; i++)
{
q[7]>>x; q[8]>>y;
cout<<"\nx == "<<x; // чтение и вывод результатов
cout<<" == ";
cout<<(double)(cos(i+i-1)) ; // сравнение со значениями исходных формул
cout<<" y == "<<y<<" == "<<(double)(exp(i)*cos(1-i));
}
return 1;
}
....
CreateThread(NULL,0,write, (LPVOID)c,0,NULL);
HANDLE h1 = CreateThread(NULL,0,read, (LPVOID)c,0,NULL);
WaitForSingleObject(h1,INFINITE);
//Как я думаю: при компиляции создаются инструкции, что уже известно, допустим, 100 итераций по 9*X*Y*Z WaitForSingleObject и это глушит процесс при запуске. lowpoke:
сеть Петри для красоты поста