Как из двух потоков выводить данные в один файл (1.txt)
с помощью мьютексов?(такое задание)
Решена задача о 8 ферзях с помощью рекурсии.
Всего возможны 92 позиции.
Если каждый поток выводит 46 позиций в отдельный файл,
то все нормально.
А если результаты выводить в один файл то все 92
позиции не выводятся.
То есть нет согласования.
В примера про 5 чисел из интернета все работает неверно:
нет синхронизации и выводятся неодинаковые 5 чисел.
Моя программа:
#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);
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;
int ferz[8];
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);
}