Мютексы

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
student2010
Сообщения: 2
Зарегистрирован: 31 май 2010, 09:10

Это задание в институте: обязательно применить мьютексы и семафоры.
Если два потока выводят(пополам) результаты задачи о 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);
}
Vasilisk
Сообщения: 116
Зарегистрирован: 13 фев 2004, 18:43

Спасибо! Теперь будем знать, что она работает неправильно...
Ответить