Добрый вечер. Нужно портировать задачу под Linux, а я Linux даже в глаза не видел, не то чтобы порты писать
Половина функций в моей задаче не работает по причине присутствия Windows.h, а их аналогов я не могу найти.
Вот код:
Код:
#include <iostream>
#include <fstream>
#include <cmath>
#include <windows.h>
#define NUM_THREADS 4 //количество потоков, проверяющих числа на простоту
using namespace std;
struct PARAMS //параметры передаваемые потоку
{
int beg_index; //начальный индекс для проверки
int num; //количество проверяемых значений
};
bool suspend=false;
int maxnum; //Количество элементов
int calculated=0; //Количество проверенных чисел
PARAMS params[NUM_THREADS]; //массив параметров, передаваемых потокам
HANDLE threads[NUM_THREADS+1]; //Массив потоков программы
HANDLE hStdOut; //дескриптор консоли
CRITICAL_SECTION cs,cs1;
fstream *fs;
//Проверка числа на простоту
bool isprost(int a)
{
int i,sq=(int)sqrt((double)a); //Квадратный корень из числа
if(a<2)return false; //Если число меньше 2 - не простое
for(i=2;i<=sq;i++) if(a%i==0) break; //проверка делителей от 2 до корня из числа
if(i==sq+1) return true; //Если ни один делитель не найден - число простое
else return false;
}
//Поток вывода прогресса
DWORD percentage(LPVOID lpv)
{
CONSOLE_SCREEN_BUFFER_INFO ci;
int perc;
static SHORT lastspace=!!(GetKeyState(VK_SPACE)&0x80);
static SHORT lastesc=!!(GetKeyState(VK_ESCAPE)&0x80);
SHORT space,esc;
while((perc=100*calculated/maxnum)<100) //Вывод пока сделана меньше 100%
{
GetConsoleScreenBufferInfo(hStdOut,&ci); //Получение информации о консоли
ci.dwCursorPosition.X=0;
SetConsoleCursorPosition(hStdOut,ci.dwCursorPosition); //Перемещение курсора в начало строки
for(int i=0;i<perc/2;i++) cout << 'X'; //Вывод прогресса
cout << " " << perc << '%'; // проценты
space=!!(GetKeyState(VK_SPACE)&0x80);
esc=!!(GetKeyState(VK_ESCAPE)&0x80);
if(esc)
{
for(int i=0;i<NUM_THREADS;i++)
{
if(suspend)
{
ResumeThread(threads[i]);
Sleep(100);
}
TerminateThread(threads[i],0);
}
ExitThread(0);
}
if(space&&space!=lastspace&&!suspend)
{
for(int i=0;i<NUM_THREADS;i++)
{
SuspendThread(threads[i]);
}
suspend=true;
}
else if(space&&space!=lastspace&&suspend)
{
for(int i=0;i<NUM_THREADS;i++)
{
ResumeThread(threads[i]);
}
suspend=false;
}
lastspace=space;
Sleep(100);
}
//Вывод окончательного прогресса.
GetConsoleScreenBufferInfo(hStdOut,&ci);
ci.dwCursorPosition.X=0;
SetConsoleCursorPosition(hStdOut,ci.dwCursorPosition);
for(int i=0;i<perc/2;i++) cout << 'X';
cout << " " << perc << '%';
return 0;
}
//Поток проверки чисел на простоту
VOID WINAPI check( PARAMS *lpv)
{
int i;
//Проверить выделенное потоку количество чисел
for(i=lpv->beg_index;i<lpv->beg_index+lpv->num;i++)
{
if(isprost(i))
{
EnterCriticalSection(&cs);
*fs << i << endl;
LeaveCriticalSection(&cs);
}
EnterCriticalSection(&cs1);
calculated++;
LeaveCriticalSection(&cs1);
}
ExitThread(0);
}
int main(int argc, char *argv[])
{
DWORD th;
setlocale(LC_ALL,"Russian");//русская локаль
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); //получить дескриптор консоли
cout << "Введите значение: ";
cin >> maxnum;
if (maxnum<NUM_THREADS)
{
cout << "Количество элементов меньше, чем количество потоков" << endl;
system("pause");
return 1;
}
fs=new fstream("simple.txt",ios::out);
InitializeCriticalSection(&cs);
InitializeCriticalSection(&cs1);
cout << "Пробел - пауза/запуск, Esc - конец" << endl;
for(int i=0;i<NUM_THREADS;i++) //раскидывание диапазонов чисел для проверки по потокам
{
//каждому потоку дается равное количество чисел для проверки
params[i].beg_index=i*(maxnum/NUM_THREADS);
if(i==NUM_THREADS-1)
{
params[i].num=maxnum-params[i].beg_index; //Если количество потоков не кратно количеству чисел,
//числа раскидываются поровну, а последнему потоку что осталось
}
else
{
params[i].num=maxnum/NUM_THREADS; //делим поровну
}
threads[i]=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)check,¶ms[i],CREATE_SUSPENDED|THREAD_ALL_ACCESS,&th);
ResumeThread(threads[i]);
}
percentage(0);
WaitForMultipleObjects(NUM_THREADS+1,threads,TRUE,INFINITE); //Ожидание окончания всех потоков
DeleteCriticalSection(&cs);
DeleteCriticalSection(&cs1);
cout << endl;
fs->close();
cout << "Сформирован файл simple.txt" << endl;
system("pause");
return 0;
}
Преподаватель сказал использовать pthread.h
Я смог только заменить критические секции на мьютексы и CreateThread на pthread_create