Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "pthread.h"
- #include "semaphore.h"
- #include <fstream>
- #include <vector>
- #include <chrono>
- #include <queue>
- #include <list>
- #pragma comment(lib,"pthreadVCE2.lib")
- #define THREADS_COUNT 1
- using namespace std;
- pthread_mutex_t outputMutex;
- pthread_mutex_t inputMutex;
- ofstream out("output.txt"); //запись
- ifstream in("input.txt"); //запись
- FILE* fp;
- list<int> mas;
- struct arg {
- list <int>* multiplier = new list <int> ();
- pthread_mutex_t m;
- arg()
- {
- pthread_mutex_init(&m, nullptr);
- }
- };
- void* write(void* param) {
- arg* args = (arg*) param;
- pthread_mutex_lock(&outputMutex);//заблокировать мьютекс на запись
- pthread_mutex_lock(&args->m);
- for (auto iter = args->multiplier->begin(); iter != args->multiplier->end();iter++) {
- cout << "O\n";
- if (*iter != 1)
- out << *iter << " ";
- else
- out << endl;
- }
- pthread_mutex_unlock(&outputMutex);//разблокировать мьютекс на запись
- pthread_mutex_unlock(&args->m);
- return 0;
- }
- void* readingCalculation(void* param) {
- int val=1;
- pthread_t t;
- arg *args = new arg();
- //pthread_mutex_init(&args->m, nullptr);
- while (1)
- {
- pthread_mutex_lock(&inputMutex);//заблокировать мьютекс на чтение
- val = mas.front();
- mas.pop_front();
- pthread_mutex_unlock(&inputMutex); //считать и разблокировать
- pthread_mutex_lock(&args->m);
- for (int div = 2; val > 1; div++){ //разложение на множители
- while (val % div == 0){
- args->multiplier->push_back(div);
- val = val / div;
- }
- }
- cout << "I\n";
- args->multiplier->push_back(1);
- pthread_mutex_unlock(&args->m);
- pthread_create(&t, NULL, write, (void*)args);
- }
- return 0;
- }
- int main() {
- setlocale(LC_ALL, "ru");
- if (!out) // если файл не открыт
- {
- cout << "Файл для записи не может быть открыт!\n"; // сообщить об этом
- return 0;
- }
- if (!in) // если файл не открыт
- {
- cout << "Файл для чтения не может быть открыт!\n"; // сообщить об этом
- return 0;
- }
- int a;
- while (!in.eof())
- {
- in >> a;
- mas.push_back(a);
- }
- for (int m : mas)
- {
- cout << m;
- }
- pthread_t t[THREADS_COUNT]; //кол-во потоков
- pthread_mutex_init(&inputMutex, nullptr); //мьютекс на вывод результата
- pthread_mutex_init(&outputMutex, nullptr);
- for (int i = 0; i < THREADS_COUNT; i++) {//инициализация потоков
- pthread_create(&t[i], NULL, readingCalculation, NULL);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement