• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wątki w systemie Windows

Object Storage Arubacloud
0 głosów
440 wizyt
pytanie zadane 18 stycznia 2021 w C i C++ przez MaTiDxxx Początkujący (290 p.)
// dodac memset
//dynamiczne zalokowac pamiec na tablice
//wyzerowac tablice na watki

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>


#define MAX_THREADS 101
double caly_iloczyn = 1;
HANDLE muteks;
//HANDLE tab_na_watki[MAX_THREADS];

typedef struct
{
	int indeks_poczat;
	int rozmiar;
}Zakres;

Zakres zakres[MAX_THREADS];
memset(*zakres, 0, sizeof(zakres));

DWORD WINAPI obliczanie_iloczynu(LPVOID wsk)
{
	Zakres* wsk_z = (Zakres*)wsk;
	int indeks_poczat = wsk_z->indeks_poczat;
	int rozmiar = wsk_z->rozmiar;
	printf("%d %d\n\n", indeks_poczat, rozmiar);
	printf("Thread #%d size=%d first=%d \n", GetCurrentThreadId(), rozmiar, indeks_poczat);
	double iloczyn_czast = 1;
	for (int i = 0; i < rozmiar; i++)
	{
		int indeks = indeks_poczat + i;
		int licznik = indeks;
		int mianownik = indeks;
		if (indeks % 2 == 1) licznik += 1;
		else mianownik += 1;
		iloczyn_czast *= licznik;
		iloczyn_czast /= mianownik;

	}
	WaitForSingleObject(muteks, INFINITE);
	caly_iloczyn *= iloczyn_czast;
	ReleaseMutex(muteks);
	printf("Thread #%d prod=%lf \n", GetCurrentThreadId(), iloczyn_czast);
	return 0;
}



int main(int argc, char* argv[])
{
	if (argc != 3)
	{
		printf("nie wlasciwa ilosc argumentow");
		exit(-1);
	}

	int n = atoi(argv[1]);
	int w = atoi(argv[2]);

	if (n <= 1 || n >= 1000000000)
	{
		printf("zla liczba wyrazow ciagu");
		exit(-2);
	}
	if (w <= 1 || w >= 100)
	{
		printf("zla liczba wyrazow ciagu");
		exit(-2);
	}

	muteks = CreateMutex(NULL, FALSE, NULL);
	if (muteks == 0)
	{
		printf("blad przy tworzeniu muteksu");
	}
	DWORD id_watku;

	clock_t start;
	clock_t stop;
	double czas;
	start = clock();
	HANDLE* tab_na_watki = (HANDLE*)malloc((w + 1) * sizeof(HANDLE));

	for (int watek = 1; watek <= w; watek++)
	{
		int rozmiar_zakresu = n / w;

		if (watek == w)
		{
			rozmiar_zakresu += n % w; // reszta z dzielenia
		}
		zakres[watek].rozmiar = rozmiar_zakresu;
		zakres[watek].indeks_poczat = (watek - 1) * (n / w) + 1;
		tab_na_watki[watek] = CreateThread(NULL, 0, obliczanie_iloczynu, (LPVOID)&tab_na_watki[watek], 0, &id_watku);
		if (tab_na_watki[watek] == NULL)
		{
			printf("Blad przy tworzeniu watkow");
		}
		// 1 arg - adres pod którym ma zostać zapamiętany id wątku
		// 3 arg - funkcja liczÄ…ca iloczyn czÄ…stkowy
		// 4 arg - parametry przekazywane temu wÄ…tkowi do funkcji
	}
	
	WaitForMultipleObjects(w, tab_na_watki + 1, TRUE, INFINITE);
	stop = clock();
	czas = (stop - start) / (double)CLOCKS_PER_SEC;

	for (int i = 1; i <= w; i++)
	{
		CloseHandle(tab_na_watki[i]); //zamkniecie uchywtu do wÄ…tku
	}

	CloseHandle(muteks);
	printf("w/Threads: PI= %lf time= %lfs \n", 2 * caly_iloczyn, czas);

	start = clock();
	double iloczyn = 1;
	for (int i = 0; i < n; i++)
	{
		int indeks = 1 + i;
		int licznik = indeks;
		int mianownik = indeks;
		if (indeks % 2 == 1) licznik += 1;
		else mianownik += 1;
		iloczyn *= licznik;
		iloczyn /= mianownik;

	}
	stop = clock();
	czas = (stop - start) / (double)CLOCKS_PER_SEC;
	printf("wo/Threads: PI= %lf time= %lfs \n", 2 * iloczyn, czas);

	free(tab_na_watki);
	return 0;
}

Witam, program wyrzuca nastepujace komunikaty:

plik.c:1:1: error: stray '\304' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
 ^
plik.c:1:2: error: stray '\217' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
  ^
plik.c:1:3: error: stray '\302' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
   ^
plik.c:1:4: error: stray '\273' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
    ^
plik.c:1:5: error: stray '\305' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
     ^
plik.c:1:6: error: stray '\274' in program
 ´╗┐─Ć┬╗┼╝// dodac memset
      ^
plik.c:23:8: error: expected declaration specifiers or '...' before '*' token
 memset(*zakres, 0, sizeof(zakres));
        ^
plik.c:23:17: error: expected declaration specifiers or '...' before numeric constant
 memset(*zakres, 0, sizeof(zakres));
                 ^
plik.c:23:20: error: expected declaration specifiers or '...' before 'sizeof'
 memset(*zakres, 0, sizeof(zakres));

Czy wie ktos gdzie jest problem albo jak go naprawic?

komentarz 18 stycznia 2021 przez adrian17 Ekspert (344,860 p.)
Zakres zakres[MAX_THREADS];
memset(*zakres, 0, sizeof(zakres));

Próbujesz wykonać kod poza funkcją, co nie ma sensu.

To _podwójnie_ nie ma sensu, bo zmienne globalne są domyślnie zainicjalizowane zerami - ten memset jest niepotrzebny.

komentarz 18 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
Poza tym w linii pierwszej masz różne znaczki przed komentarzem, których nie powinno tam być.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
3 odpowiedzi 390 wizyt
pytanie zadane 3 marca 2020 w Systemy operacyjne, programy przez thekibi27 Bywalec (2,110 p.)
0 głosów
1 odpowiedź 321 wizyt
pytanie zadane 4 listopada 2018 w Inne języki przez Krlk Początkujący (390 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...