6 / 6 / 5
Регистрация: 11.11.2007
Сообщений: 20
1

Mutex. Два потока записи в файл

28.11.2009, 22:55. Показов 12326. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть задача синхронизировать два потока. Один записывает порции нечетных(write1) чисел, другой порции четных(write2). Надо синхронизировать чтобы поочередно записывались четные-нечетные:
000000000011111111112222222222333333333...
Использую мьютекс, но получается либо запись 00000000222222224444444.... либо 11111111133333333 вместо того что надо =(. Как исправить чтобы выполнялся не весь процесс целиком а его часть, а потом преход к другому?
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
#include <fstream>
#include <windows.h>
 
using namespace std;
HANDLE ghMutex;
HANDLE aThread[2];
 
void write1()
{
    ghMutex = OpenMutexA(SYNCHRONIZE, false, "mutexos");//t f?
    ofstream f1("1.txt", ios_base::app);
    for (int i=0; i<10; i += 2) { 
        WaitForSingleObject(ghMutex, INFINITE);
        for (int j=0; j<10; j++)
            f1 << i;    
        ReleaseMutex(ghMutex);
        Sleep(50);
    }
    f1.close();
}
 
void write2()
{
    ghMutex = OpenMutexA(SYNCHRONIZE, false, "mutexos");
    ofstream f2("1.txt", ios_base::app);
    for (int i=1; i<10; i += 2) {
        WaitForSingleObject(ghMutex, INFINITE);         
        for (int j=0; j<10; j++)
            f2 << i;
        ReleaseMutex(ghMutex);
        Sleep(50);
    } 
    f2.close();
}
 
void main()
{
    DWORD ThreadID;
    ghMutex = CreateMutexA(NULL, false, "mutexos");
 
    aThread[0] = CreateThread( 
                 NULL,       // default security attributes
                 0,          // default stack size
                 (LPTHREAD_START_ROUTINE) write1,
                 NULL,       // no thread function arguments
                 0,          // default creation flags CREATE_SUSPENDED?
                 &ThreadID); // receive thread identifier
    aThread[1] = CreateThread( 
                 NULL,       // default security attributes
                 0,          // default stack size
                 (LPTHREAD_START_ROUTINE) write2, 
                 NULL,       // no thread function arguments
                 0,          // default creation flags CREATE_SUSPENDED?
                 &ThreadID); // receive thread identifier
 
    WaitForMultipleObjects(2, aThread, TRUE, INFINITE);
 
    CloseHandle(aThread[0]);
    CloseHandle(aThread[1]);
    CloseHandle(ghMutex);     
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2009, 22:55
Ответы с готовыми решениями:

Надо ли использовать mutex при записи в map из несколькх потоков одновременно?
Такой вопрос, надо ли использовать mutex при записи в map из несколькх потоков одновременно? или...

Два потока, чтения и записи с ком порта
с++, старый,не нэтовский, вроде 2000, может старее два потока, чтения и записи с ком порта,...

Два потока в одном процессе, конфликт чтения/записи файлов
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два потока, которые...

Ошибка при записи в файл с потока
Команда 1 зачем-то стала выводить значения, которые я записываю с потока в файл. Раньше же, когда я...

4
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.11.2009, 23:21 2
Вот пример с MSDN
http://msdn.microsoft.com/en-u... S.85).aspx
1
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
28.11.2009, 23:26 3
кхм))) у тебя сначала открывается файл на запись, а потом включается синхронизация - но 2 раза открыть файл на запись - невозможно!
1
6 / 6 / 5
Регистрация: 11.11.2007
Сообщений: 20
28.11.2009, 23:27  [ТС] 4
Evg думаю можно найти параллели между вашей ссылкой и моим кодом

----------
всем спс исправил теперь работает как надо(удалил Sleep() и файл открываю один раз)
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.11.2009, 23:44 5
Цитата Сообщение от spavel Посмотреть сообщение
Evg думаю можно найти параллели между вашей ссылкой и моим кодом
Так в микрософтовском примере делается практически то же самое, только не в файл, а в стандартный вывод
0
28.11.2009, 23:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2009, 23:44
Помогаю со студенческими работами здесь

Помогите доделать программу: объедение два потока в один файл
У меня проблема , я не могу объедение два потока в один файл , на листинге представлен код для...

Два потока, две очереди, два потока
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные...

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { using...

Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета
Здравствуйте! Имеется вот такой незамысловатый метод отправки пакетов на сокет клиента ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru