Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296

Проблема синхронизации потоков

07.10.2011, 09:54. Показов 3623. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Нужно показать проблему синхронизации потоков. Помогите пожалуйста.
Вот мои наработки:
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
#include <iostream>
#include <wait.h>
#include <stdio.h>
#include <string.h>
using namespace std;
char str[60];
 
struct thread_arg
{
    char *key;
    int numThr;
};
void *thread_f (void *arg)
{
    struct thread_arg targ = *(struct thread_arg *) arg;
    
    for (int i=0; i<5; i++)
    {
        strcat (str, targ.key);
        //sleep(1000);
    }
}
int main()
{
    int countPth = 0; // колличество потоков
    cout << "Enter the amount of pthreads: ";
    cin >> countPth;    
    struct thread_arg targ;
    pthread_t thread[countPth];
    strcpy(str, "String: ");
    char ch;
    int i = 0;
    for (i=0, ch='a'; i<countPth; i++, ch++)
    {
        pthread_create(&thread[i], NULL, &thread_f, &targ);
        targ.numThr = i;
        targ.key = (char *)ch;
    }   
    for (int i=0; i<countPth; i++)
    {
        pthread_join(thread[i],NULL);
        cout << " ";
    }
    puts(str);
    return 0;
}
Каждый поток должен отрабоать, и в выводе, должна получиться белиберда.
Вся загвоздка в том, что не могу сообразить, как тут сделать:
C++
1
char *key;
C++
1
strcat (str, targ.key);
C++
1
targ.key = (char *)ch;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2011, 09:54
Ответы с готовыми решениями:

Пример синхронизации потоков из учебника
Здравствуйте! Я - новичок, поэтому заранее извиняюсь за возможно детский вопрос. Приведу вначале листинг кода из учебника Шилдта, который...

Простейший случай синхронизации потоков
только изучаю winapi. ситуация наверное банальная, но совсем запутался. например в функции Thread реализован некоторый итерационный...

Более рациональный способ синхронизации потоков
Вот что делаю я, чтобы дождаться выполнения метода, который вызывается неконтролируемоTask tsk = Task.Factory.StartNew(() =&gt; { while...

23
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
12.10.2011, 16:02
Студворк — интернет-сервис помощи студентам
Ну не знаю я))) Как хотите. Я вам страницу назад сказал, что мне бросились в глаза 2 вещи:
1. А поместиться ли вывод 101 нити в char[100]?
2. new только выделит память под ваши массивы, но их содержимое не предсказуемо - инициализируйте нулем.
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
12.10.2011, 16:41  [ТС]
Здесь:
C++
1
2
turn = new int[N];
stage = new int[N + 1];
Или же здесь:
C++
1
2
int *turn;   // очередь
int *stage;  // стадия
C++
1
2
int *turn = 0;
int *stage = 0;
Добавлено через 19 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i=0; i<5; i++)
{
    if (strlen(str) < 100)
    {
        strcat(str, targ->key);
        if (i == 4)
        strcat(str, " ");
    }
    else
    {
        cout << "Error! Going beyond the array..." << endl;
        break;
    }
}
Вы это имели ввиду?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
12.10.2011, 17:09
Что вы как маленький:
C++
1
turn = new int[N];
Вот вы объявили массив, с 27й строки у вас:
C
1
2
3
4
5
6
7
        stage[thr] = i;
        turn[i] = thr;
        for (int j=1; j<=N; j++)        // опрос остальных потоков
        {
                if (j == thr)
                continue;
            while ((stage[j] >= i) && (turn[i] == thr))
Что например во 1й ячейке массива? правильно все что угодно, а это плохо) Если же изначально там будет нуль, то все, всегда будет чудесно.

Со строкой как хотите. Можно как вы, можно выделять память под строку после ввода N, можно проверять что N не больше M, много чего можно. Но вы уж как-нибудь сами)
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
12.10.2011, 17:44  [ТС]
Цитата Сообщение от Visary_Master Посмотреть сообщение
C++
1
2
int *turn; // очередь
int *stage; // стадия
Это сделать так?

Добавлено через 1 минуту
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
C++
1
2
3
4
5
6
7
stage[thr] = i;
turn[i] = thr;
for (int j=1; j<=N; j++) // опрос остальных потоков
{
if (j == thr)
continue;
while ((stage[j] >= i) && (turn[i] == thr))
Что например во 1й ячейке массива? правильно все что угодно, а это плохо) Если же изначально там будет нуль, то все, всегда будет чудесно.
А перед этим добавить:
C++
1
2
stage[0] = 0;
turn[0] = 0;
Так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2011, 17:44

Задача синхронизации потоков. Потокобезопасный инкремент
Помогите решить задачу по синхронизации потоков. Никак не могу разобраться. Есть класс со статическим полем numberOfInstances и...

Средства синхронизации потоков. Длительное ожидание
Здравствуйте. Сперва опишу абстрактную суть задачи: есть сервис который работает с объектами определенного типа. когда появляется...

Как реализовать рекурсию в синхронизации потоков
Здравствуйте.Объясните чайнику как реализовать рекурсию в синхронизации потоков(сам софт брутфорс).Т.е есть Хороший,плохой и ошибка.Нужно...

Использование mutex для синхронизации двух потоков
Доброго времени суток! Никак не могу понять, как нужно использовать мьютексы для синхронизации потоков. Например, в моей задаче есть два...

Понятие синхронизации потоков и процессов. Семафоры и мьютексы
Хотелось бы обсудить и уточнить некоторые понятия: 1. Корректно ли следующее утверждение. Синхронизация - это обеспечение...


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

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

Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru