Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296

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

07.10.2011, 09:54. Показов 3610. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
155. Min Stack Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы: NewMinStack() *MinStack — инициализация Push(val int) —. . .
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru