Форум программистов, компьютерный форум CyberForum.ru

потоки, мьютекс и семафор - C++

Восстановить пароль Регистрация
 
Vla00
5 / 5 / 3
Регистрация: 06.10.2012
Сообщений: 415
12.12.2013, 20:03     потоки, мьютекс и семафор #1
Вот задание: Выполнить индивидуальное задание параллельным алгоритмом (обязательно использовать для разграничения общих ресурсов мьютексы или семафоры, события, критически секции, таймеры);
Индивидуальное задание: Поиск в текстовом файле всех слов, заданных в другом текстом файле;

Не понимаю как выполнить и как должно работать. Можете обьяснить всё по полочкам или же сделать, по коду разберусь.. Вот сделаное Индивидуальное задание:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <time.h>
 
using namespace std;
 
 
void proc(string s_sl)
{
    ifstream f_text("text.txt");
    string s_text;
    while(f_text >> s_text)
    {
        if((*(s_text.end() - 1) == ',') || (*(s_text.end() - 1) == '.') || (*(s_text.end() - 1) == ';') || (*(s_text.end() - 1) == ':'))
        {
            s_text.erase(s_text.end() - 1);
        }
        if(s_sl == s_text)
        {
            cout<<"Слово: " << s_sl;
            cout <<"\n";
            break;
        }
    }
    f_text.clear();
    f_text.seekg(0);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    clock_t time;
    time = clock();
 
    setlocale(LC_ALL, "");
 
    
    ifstream f_sl("slova.txt");
    if(f_sl)
    {
      string s_sl;
      while(f_sl >> s_sl)
      {
          if((*(s_sl.end() - 1) == ',') || (*(s_sl.end() - 1) == '.') || (*(s_sl.end() - 1) == ';') || (*(s_sl.end() - 1) == ':'))
          {
              s_sl.erase(s_sl.end() - 1);
          }
 
          proc(s_sl);
      }
 
      time = clock() - time;
      cout <<"Время выполнения: " << (double)time/CLOCKS_PER_SEC;
      cout <<" сек.\n";
    }
    else cerr<<"Error";
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 20:03     потоки, мьютекс и семафор
Посмотрите здесь:

Потоки C++
Потоки C++
C++ Потоки
Мьютекс, не могу понять, сигналирован или нет C++
C++ Мьютекс в чем ошибка
C++ C++11,mingw 4.7.2 Мьютекс не тип из std
C++ Межпроцессорный мьютекс linux
Синхронизация мьютекс C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.12.2013, 22:39     потоки, мьютекс и семафор #2

Не по теме:

И что ваш код имеет общего с параллельным выполнением?


Параллельно тут можно разве что файлы читать для подготовки данных. А все пересекающиеся слова можно найти с помощью set_intersection. Что то вроде такого кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
#include <set>
#include <future>
#include <algorithm>
#include <windows.h>
 
std::set<std::string> get_all_words(std::string const& file)
{
   using input = std::istream_iterator<std::string>;
   std::ifstream ifs(file.c_str());
   if (!ifs.is_open()) throw std::logic_error(std::string("can't open file ") + file + ".\n");
   return std::set<std::string> {input(ifs), input()};
}
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   std::string file1 = "D:/where.txt", file2 = "D:/what.txt";
 
   try {
      auto f1 = std::async(get_all_words, file1);
      auto f2 = std::async(get_all_words, file2);
 
      std::set<std::string> words {f1.get()}, finding_words {f2.get()};
 
      std::set_intersection(words.begin(), words.end(),
                            finding_words.begin(), finding_words.end(),
                            std::ostream_iterator<std::string>(std::cout, "\n"));
   }
   catch (std::logic_error& e) {std::cerr << e.what();}
   catch (...) {std::cerr << "some uknown error.\n";}
 
   std::cout << "\n\nDone." << std::endl;
   return 0;
}
Yandex
Объявления
12.12.2013, 22:39     потоки, мьютекс и семафор
Ответ Создать тему
Опции темы

Текущее время: 09:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru