Мютексы
Добавлено: 31 май 2010, 13:36
Это задание в институте: обязательно применить мьютексы и семафоры.
Если два потока выводят(пополам) результаты задачи о 8 ферзях, каждый
по 46 позиции в свой файл, то все нормально.
А если выводить в один файл то выводятся не все позиции и деже некоторые повторяются, счетчик работает неверно и т.п.
Известная программа из интернета про пять чисел тоже работает неправвильно
выводятся неодинаковые числа, т.е. нет согласования потоков.
Вот моя программа:
Если два потока выводят(пополам) результаты задачи о 8 ферзях, каждый
по 46 позиции в свой файл, то все нормально.
А если выводить в один файл то выводятся не все позиции и деже некоторые повторяются, счетчик работает неверно и т.п.
Известная программа из интернета про пять чисел тоже работает неправвильно
выводятся неодинаковые числа, т.е. нет согласования потоков.
Вот моя программа:
Код: Выделить всё
#include <stdio.h>
#include <windows.h>
#include <process.h> /* _beginthread, _endthread */
#include <stddef.h>
#include <stdlib.h>
#include <conio.h>
HANDLE myMutex;
int ferz[8];
int count=0;
FILE *fout;
int prov(int ferz[8],int n ,int j)
{
int i,k;
if (n==8) return 1;
for (k=1; k<=n; k++)
{
if ( ferz[n-k]==j) return 1;
if ( ferz[n-k]==j+k) return 1;
if ( ferz[n-k]==j-k) return 1;
}
return 0;
}
void back(int k)
{
int i,n;
for (n=0;n<8;n++)
{
if (prov(ferz,k,n)==0)
{
ferz[k]=n;
if (k==7)
{
WaitForSingleObject( myMutex, INFINITE );
for (i=0;i<8;i++) fprintf(fout,"%1d",ferz[i]);
fprintf(fout,"\n");
count++;
ReleaseMutex( myMutex );
}
back(k+1);
}
}
}
unsigned int __stdcall f1(void *)
{
int i;
for (i=0;i<4;i++)
{
ferz[0]=i;
back(1);
}
return 0;
}
unsigned int __stdcall f2(void *)
{
int i;
for (i=4;i<8;i++)
{
ferz[0]=i;
back(1);
}
return 0;
}
void main(void)
{
int i,k,p;
fout=fopen("1.txt","w");
myMutex = CreateMutex( NULL, FALSE, NULL );
HANDLE hThread_1;
HANDLE hThread_2;
unsigned threadid;
hThread_1 = (HANDLE)_beginthreadex(NULL,0, &f1, NULL, 0, &threadid);
hThread_2 = (HANDLE)_beginthreadex( NULL,0,&f2, NULL, 0, &threadid);
WaitForSingleObject(hThread_1, INFINITE);
WaitForSingleObject(hThread_2, INFINITE);
printf("\nc= %d\n",count);
printf("SEE Files 1.txt \n");
fclose(fout);
fgetc(stdin);
}