示例#1
0
文件: program.c 项目: jagub2/ak2
int main(int argc, char*argv[]) {
    double start, koniec, krok, wynik;
    unsigned short precyzja, zaokraglenie, fpucw;
    fpucw = 0;
    wynik = 0;
    if(argc < 6) {
        printf("Podaj: wartosc poczatkowa, koncowa, krok, precyzje i tryb zaokraglenia:\n"
                "precyzja:\n"
                "0 - pojedyncza precyzja\n"
                "1 - podwojna precyzja\n"
                "2 - rozszerzona podwojna precyzja (domyslnie)\n"
                "tryb zaokraglenia:\n"
                "0 - zaokraglij do najblizszej (domyslnie)\n"
                "1 - zaokraglij w dol\n"
                "2 - zaokraglij w gore\n"
                "3 - zaokraglij do zera\n");
        scanf("%lf %lf %lf %hu %hu", &start, &koniec, &krok, &precyzja, &zaokraglenie);
    } else {
        sscanf(argv[1], "%lf", &start);
        sscanf(argv[2], "%lf", &koniec);
        sscanf(argv[3], "%lf", &krok);
        sscanf(argv[4], "%hu", &precyzja);
        sscanf(argv[5], "%hu", &zaokraglenie);
    }
    fpucw = get_fpu(); // pobierz stare flagi
    printf("control word:\nbyl: %04x; ", fpucw);
    // wyliczenie odpowiedniej wartosci control word, na podstawie precyzji i zaokraglenia
    if(precyzja > 2) precyzja = 2; // jezeli precyzja > 2, to ustaw domyslna (rozszerzona podwojna)
    if(zaokraglenie > 3) zaokraglenie = 0; // jesli zaokraglenie > 3, to ustaw domyslne (do najblizszej)
    if(precyzja > 0) ++precyzja; // ustaw odpowiednia wartosc dla flagi precyzji (w uzyciu jest 0, 2, 3)
    precyzja <<= 8; // przesun precyzje na odpowiednie miejsce
    zaokraglenie <<= 10; // tak samo tryb zaokraglenia
    fpucw = 0x7f; // ustaw inne flagi (na podstawie wartosci domyslnej)
    fpucw |= precyzja; // dolacz nowe flagi
    fpucw |= zaokraglenie;
    set_fpu(fpucw); // ustaw nowe
    fpucw = get_fpu(); // pobierz nowe
    printf("jest: %04x\n", fpucw);

    wynik = calka(start, koniec, krok); // oblicz calke
    printf("int 1/x dx %lf..%lf = %lf\n", start, koniec, wynik);

    return 0;
}
示例#2
0
int main()
{
	//Calka z sinusa
	cout << "CALKA Z SINUSA" << endl;
	double result = 0.0;
	TworzenieWatkow calka(0, M_PI, &result);
	boost::thread thread(calka);
	cout << "Hardware concurrency: " << boost::thread::hardware_concurrency
		<< endl;
	cout << "Thread ID" << thread.get_id() << endl;
	thread.join();
	cout << "result" << result << endl;
	cout << "DONE!";
	getchar();
	//-------------------------------------
	//Synchronizacja
	cout << "SYNCHRONIZACJA" << endl;
	mutex characterMutex;
	string lancuch;
	lancuch.resize(CHARACTERS_TO_WRITE);
	thread_group threads;
	for (unsigned int i = 0; i < NUMBER_OF_THREADS; ++i)
		threads.create_thread(Watek('a'+i,lancuch,characterMutex));
	threads.join_all();
	cout << lancuch << endl;
	cout << "DONE!";
	getchar();
	//----------------------------------------
	//Zmienne warunkowe
	cout << "ZMIENNE WARUNKOWE"<<endl;
	mutex dataMutex;
	Monitor<char>container(dataMutex);
	thread_group conditional;
	mutex consoleMutex;
	for (int i = 0; i < 5; i++) {
		conditional.create_thread(Consumer(container,i,consoleMutex));
		conditional.create_thread(Producer(container,i,consoleMutex));
	}
	conditional.join_all();
	cout << "DONE!";
	getchar();
	//------------------------------------
	//Pociagi/semafory
	cout << "STACJA KOLEJOWA"<<endl;
	Peron p1("p1"), p2("p2"), p3("p3");
	Train tr1 = Train("T1", p2, p1);
	boost::thread t1(tr1);
	boost::thread t2(Train("T2", p2, p3));
	boost::thread t3(Train("T3", p2, p1));
	boost::thread t4(Train("T4", p2, p3));
	t1.join();
	t2.join();
	t3.join();
	t4.join();
	cout << "DONE"<<endl;
	getchar();
	cout << "FILOZOFOWIE" << endl;
	Semafor eating(PHILOSOPHERS - 1);

	Fork* forks[5];
	thread_group philosophers;
	for (int i = 0; i<PHILOSOPHERS; i++)
	{
		forks[i] = new Fork(i);
	}
	for (int i = 0; i<PHILOSOPHERS; i++)
	{
		philosophers.create_thread(Philosopher(i, forks[i], forks[(i + (PHILOSOPHERS -1)) % PHILOSOPHERS], eating));
	}
	philosophers.join_all();
	cout << "DONE"<<endl;
	getchar();
	cout << "TASK 1" << endl;
	mutex tConsoleMutex;
	Task1 taskOne(tConsoleMutex,0);
	Task1 taskTwo(tConsoleMutex,1);
	boost::thread th1(taskOne);
	boost::thread th2(taskTwo);
	th1.join();
	th2.join();
	cout << "DONE" << endl;
	getchar();
	cout << "TASK 2" << endl;
	boost::mutex task2Mutex;
	Task2 task2DataGenerator(100);
	boost::thread task2Thread(task2DataGenerator);
	boost::unique_lock<mutex>task2Lock(task2Mutex);
	task2DataGenerator.task2isGeneratingData->wait(task2Lock);
	for (int i = 0; i < 100; i++)cout << task2Array[i] << endl;
	cout << "DONE" << endl; 
	getchar();
	cout << "TASK 3" << endl;
	thread_group task3Group;
	Semafor task3Semafor(1);
	Semafor task3Max3ThreadsSemafor(3);
	for (int i = 0; i < 10; i++) {
		task3Group.create_thread(Task3(task3Max3ThreadsSemafor,task3Semafor,i));
	}
	task3Group.join_all();
	cout << "DONE" << endl;
	getchar();
	cout << "SMOLKA EXAM"<<endl;
	cout << "TASK 1"<<endl;
	boost::mutex sConsoleMutex;
	STask1 st1(sConsoleMutex);
	STask1 st2(sConsoleMutex);
	boost::thread sTask1Thread(st1);
	boost::thread sTask1Thread2(st2);
	sTask1Thread.join();
	sTask1Thread2.join();
	cout << "DONE" << endl;
	getchar();
	cout << "TASK 2" << endl;
	sN = 75;
	boost::thread sTask2Thread(sTask2);
	boost::mutex sTask2Mutex;
	boost::unique_lock<mutex>sTask2Lock(sTask2Mutex);
	sTask2Condition.wait(sTask2Lock);
	for (int i = 0; i < 75; i++) {
		cout<< sTask2Array[i]<<endl;
	}
	getchar();
    return 0;
}