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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tranvay
0 / 0 / 1
Регистрация: 12.08.2010
Сообщений: 75
#1

симафор или нет? - C++

10.10.2011, 13:53. Просмотров 446. Ответов 2
Метки нет (Все метки)

ПРивет всем!

написал программу для следующего задания с использованием симафора:

Написать программу, создающую два потока. Оба потока одновременно читают один и тот же текстовый файл. Первый поток считает количество символов в файле, второй количество пробелов. После окончания потоки должны создать один файл, записать в него результаты работы и идентифицировать себя;

Это правильно использовать симафор или нужно применить Объекты mutex/Критический раздел/Событие ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2011, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос симафор или нет? (C++):

Ошибка с массивами, хотя формально её нет (похожи ли массивы или нет?) - C++
Всем доброго времени суток!) В общем имею такую великолепную чтуку, она должна говорить мне, похожи ли массивы или нет, массив должен...

Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет - C++
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если...

Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? - C++
bool fnd(char* fn,string stf) { string s; ifstream ifs(fn); while (!ifs.eof()) { getline(ifs,s); ...

Вывести True или False в зависимости от того, имеют три заданных целых числа одинаковую четность или нет - C++
Всем привет! Помогите, пожалуйста в решении задачи. Знаю, что задачи более,или менее лёгкие,но я в c++ почти ничего не смыслю, а лабы...

Полиндром или нет? - C++
#include <iostream> #include <cstdio> using namespace std; int main() { setlocale(LC_ALL,"Russian"); bool otvet; int i;...

Опечатка или нет? - C++
class my_class { public: my_class() { a = b = 0; } my_class(constint...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
10.10.2011, 13:57 #2
Tranvay, Можно использовать любое из этих средств, главное правильно использовать.
Tranvay
0 / 0 / 1
Регистрация: 12.08.2010
Сообщений: 75
10.10.2011, 14:07  [ТС] #3
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// 55.cpp : main project file.
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <stdio.h>
#include <windows.h>
 
using namespace std;
 
 
 
HANDLE Threads[2], sem; //описываем 2 потока и семафор
DWORD dwThreadID; //описываем функцию-поток
 
int allSimbols = 0; //счетчик символов
int allSpace = 0; //счетчик пробелов
FILE *ofs; //файл для вывода результата
bool flag = 0; //переменная-флажок для проверки, создался ранее файл или нет
 
DWORD WINAPI thread0() //эта нить считает общее количество символов
{
     ifstream ifs ("input.txt"); //открываем файл с текстом для анализа
     string s; //рабочая строка
     allSimbols = 0; //обнуляем счетчик символов
     while (getline(ifs, s)) //вводим из файла строку
     {
          allSimbols+=s.length(); //и наращиваем счетчик символов на длину строки
     }
     ifs.close(); //закрываем файл из которого вводили
     WaitForSingleObject(sem, INFINITE); //ждем пока не освободится семафор
if (flag == 0)                         
{   
  ofs = fopen("output.txt","w"); //если флажок нулевой, создаем файл для 
  flag = 1;                     //вывода результата и меняем флажок на 1
}
     fprintf( ofs, "1: file consists of %d chars \n", allSimbols );
 
 
     ReleaseSemaphore(sem, 1, NULL); //нить закончила работу с файлом вывода и можно 
     return 0;                       //освободить семафор, что и было сделано
}
 
DWORD WINAPI thread1() //эта нить считает количество пробелов
{
     ifstream ifs ("input.txt"); //открываем файл с нужным текстом для чтения
     string s; //рабочая строка
     allSpace = 0; //обнуляем счетчик пробелов
     while (getline(ifs, s)) //вводим из файла строку
     {
         for(int i=0; i < s.length(); i++)
         if (s[i] == ' ')
         {
             allSpace++; //и проходя по строке считаем пробелы и наращиваем счетчик
         }
     }
     ifs.close(); //закрываем файл из которого вводили
     WaitForSingleObject(sem, INFINITE); //ждем пока не освободится семафор
     if (flag == 0)
     {
         ofs = fopen("output.txt","w"); //если флажок нулевой, создаем файл для
         flag = 1;                     //вывода результата и меняем флажок на 1
     }
     fprintf( ofs, "2: there are  %d spaces in this file \n", allSpace );
    
     ReleaseSemaphore(sem, 1, NULL); //нить закончила работу с файлом вывода и можно
     return 0;                       //освободить семафор, что и было сделано
}
 
 
int main(array<System::String ^> ^args)
{
    sem = CreateSemaphore(NULL, 1, 1, (LPCWSTR)"semaphor"); //создаем семафор
    Threads[0]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread0, NULL, 0, NULL);  
    Threads[1]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, NULL);  //создаем нити
      
    WaitForMultipleObjects(2, Threads, TRUE, INFINITE);//ждем пока отработают нити
    cout << "Chislo Simvolov in file are " << allSimbols << ", chislo spaces are " << allSpace << endl; 
    cout << "Otchet zanesen in file output.txt" << endl << endl;
    cout << "Press enter...";  // выводим результат работы на экран
    getch(); 
    fclose(ofs); //закрываем выходной файл
    CloseHandle(sem); //закрываем семафор
 
    return 0;
}
вот как я использовал, всё хорошо работает, но препод говорит это не рационально (
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2011, 14:07
Привет! Вот еще темы с ответами:

Палиндром или нет? - C++
Определить, является ли заданное натуральное число палиндромом, т.е. таким, десятичная запись которого читается одинаково слева направо и...

C++11 в production, да или нет? - C++
Всем привет. Выбил все-таки разрешение юзать С++11 на работе, по мелочи, лямбды вместо предикатов, range-based-for, auto. Сегодня наш тех....

Нарушение инкапсуляции или нет? - C++
Есть такой код: class Tune { private: vector&lt;int&gt; A; public: const vector&lt;int&gt;&amp; get_A() const { return A; } // &lt;- не...

Посмотрите правильно или нет. - C++
Четырехугольник ABCD задан координатами своих вершин на плоскости: A(Xa,Ya),B(Xb,Yb),C(Xc,Yc) , D(Xd,Yd).Проверить являетса ли он выпуклым....


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru