ciao,
mi stavo chiedendo se nel momento in cui viene richiamata la funzione scrivifile() da parte di uno dei thread, era sufficiente racchiudere la chiamata scrivifile() tra
codice:
EnterCriticalSection(&CSector);
scrivifile();
LeaveCriticalSection(&CSector);
per evitare che gli n thread usino contemporanemanete la medesima funzione oppure si deve scrivere direttamente le chiamate alla funzione critica nella funzione stessa.
Nel caso sopra sarebbe piuttosto comodo.
codice:
//* Use the -tWM (32-bit multi-threaded target) command-line switch for this example */
#pragma checkoption -tWM
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define NTHREADS 25
CRITICAL_SECTION CSector;
/* This function acts as the 'main' function for each new thread */
static unsigned __stdcall threadMain(void *arg)
{
EnterCriticalSection(&CSector);
scrivifile();
LeaveCriticalSection(&CSector);
return 0;
}
int main(void)
{
HANDLE hThreads[NTHREADS];
int i;
unsigned threadId;
SECURITY_ATTRIBUTES sa = {
sizeof(SECURITY_ATTRIBUTES), /* structure size */
0, /* No security descriptor */
TRUE /* Thread handle is inheritable */
};
/* Create NTHREADS inheritable threads that are initially suspended and that will run starting at threadMain()*/
for(i = 0; i < NTHREADS; i++) {
hThreads[i] = (HANDLE)_beginthreadex(
&sa, /* Thread security */
4096, /* Thread stack size */
threadMain, /* Thread starting address */
(void *)i, /* Thread start argument */
CREATE_SUSPENDED, /* Create in suspended state */
&threadId); /* Thread ID */
if(hThreads[i] == INVALID_HANDLE_VALUE) {
MessageBox(0, "Thread Creation Failed", "Error", MB_OK);
return 1;
}
printf("Created thread %2d with an ID of %u\n", i, threadId);
}
printf("\nPress ENTER to thaw all threads\n\n");
getchar();
/* Resume the suspended threads */
for(i = 0; i < NTHREADS; i++)
ResumeThread(hThreads[i]);
InitializeCriticalSection(&CSector);
/* Wait for the threads to run */
WaitForMultipleObjects(NTHREADS, hThreads, TRUE, INFINITE);
/* Close all of the thread handles */
for(i = 0; i < NTHREADS; i++)
CloseHandle(hThreads[i]);
DeleteCriticalSection(&CSector);
return 0;
}
/* ----------------------------------------------- */
void scrivifile()
{
FILE *fp;
fp=fopen();
fprintf("test.txt","w");
fclose(fp);
}