Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10

Mutex - Возможно ли создать новый поток для участка кода

18.11.2014, 13:51. Показов 1911. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
The pthread_create() function starts a new thread in the calling
process. The new thread starts execution by invoking start_routine();
arg is passed as the sole argument of start_routine().
То есть новый поток можно создать лишь через новую функцию ?
А возможно ли создать новый поток для участка кода ?

Добавлено через 21 минуту
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
#include <pthread.h>
 
int shared = 0;
pthread_mutex_t mutex;
 
void * f(void * arg){
  shared = 999;
 
 return 0;
}
 
int main(){
 
 pthread_mutex_t mutex;
 pthread_mutexattr_t *mutexattr = NULL;
 void * arg = NULL;
 
 pthread_mutex_init(&mutex, mutexattr);
 
 shared = 111;
 for(int i = 0;i < 10;i++)
      shared = 112; 
 
 pthread_t pthread;
 pthread_create(&pthread,NULL,f,arg);
 printf("%i",shared);
 
 return 0;
}
Верно ли ,что после вызова pthread_create у меня два потока
один ,который есть всегда и созданный pthread

То есть теперь не, очевидно , кто первым инициализирует переменную shared верно ?

// Сейчас выдает 112
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2014, 13:51
Ответы с готовыми решениями:

Создать программу, которая определяет классом mutex, какой поток отработал быстрее
Создать программу, работающую на трех потоках. Главный поток считывает 2 переменные x, y; запускает 2 потока каждый из которых пытается...

Что быстрее - после отработки кода, запускать новый экземпляр класса в новый поток или использовать рекурсию?
Собственно интересует такой вопрос, имеется класс реализующий интерфейс Runnable(нечто вроде ИИ), который запускается в отдельном потоке,...

Mutex не приостанавливает поток
Здравствуйте. Мне нужно написать такую программу: 1) Когда выбирается пункт меню &quot;Новое окно&quot;, создается новое окно. 2)...

9
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
18.11.2014, 16:27
Цитата Сообщение от Qazan Посмотреть сообщение
А возможно ли создать новый поток для участка кода ?
Нет, но этом возможно с помощью различных расширений языка C/C++. Кажется Intel Cilk Plus такое умеет.
Цитата Сообщение от Qazan Посмотреть сообщение
То есть теперь не, очевидно , кто первым инициализирует переменную shared верно ?
Классическое условие гонок. В общем случае не очевидно. Равновероятно 999 или 112, зависит от положения "звезд на небе"
1
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
18.11.2014, 16:34  [ТС]
grgdvo,хочу добиться результата ,чтобы выводило 112 ,
но усилия ни к чему не приводят :

Добиваюсь увелечением количества итераций в цикле

Просто хочеться глазами это увидеть
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
18.11.2014, 16:49
К соажлению mutex не решит вашу проблему. Он не подходит логически для вашей задачи.
Просто mutex обеспечит лишь выполнение одного (какого-то) из потоков в единицу времени, причем того, кто быстрее сделает mutex_lock. Опять условие гонок.
Вам нужна контролируемая очередность! То есть по завершению потоковой функции разрешить выполнить что-то. Или по завершению присваивания 999 разрешить выполнить что-то.
Для первого случая можно тупо дождаться завершения потока pthread_join, Для второго случаю помогут "условия" pthread_cond_init и там еще 2-3 функции.

Добавлено через 4 минуты
Хотя и mutex тоже подойдет. Я не понял сразу примера.
Ставьте mutex_lock перед shared=999 и перед вашим циклом где 112.
И ставьте mutex_unlock после shared=999 и после pthread_create и printf.
И будет гарантировано все время 112.
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
18.11.2014, 18:07  [ТС]
grgdvo, да, вы правы,
это мне понятно

я хочу получить пример , когда перед каждм запуском программы я получаю разные режзультаты

я мошенально ,назвал тему mutex потому ,что думал о них
а когда создал было уже поздно

Мьтексами я могу достич ,последовательное выполнение это я понимаю
я лишь хочу увидеть этот небольшой хаос , но пока достиг лишь такого результата


изменил слегка код на

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
   #include <stdio.h>
#include <pthread.h>
 
int shared = 0;
pthread_mutex_t mutex;
 
void * f(void * arg){
      shared = 999;
      printf("\n second thread %i :  \n",shared);
 return 0;
}
 
int main(){
 
 pthread_mutex_t mutex;
 pthread_mutexattr_t *mutexattr = NULL;
 void * arg = NULL;
 
 pthread_mutex_init(&mutex, mutexattr);
 
 shared = 111;
 
 pthread_t pthread;
 pthread_create(&pthread,NULL,f,arg);
 
 printf("\n Maintain  %i \n",shared);
 printf("\n Maintain  %i \n",shared);
 
 return 0;
}
--

Результаты запусков:


qazan@qazan:~/Desktop/ex$ ./a.out

Maintain 111

Maintain 999
qazan@qazan:~/Desktop/ex$ ./a.out

Maintain 111

Maintain 999

second thread 999 :
qazan@qazan:~/Desktop/ex$ ./a.out

Maintain 111

Maintain 999
qazan@qazan:~/Desktop/ex$ ./a.out

Maintain 111

Maintain 999

second thread second thread 999 :
qazan@qazan:~/Desktop/ex$ ./a.out

Maintain 111

Maintain 999
qazan@qazan:~/Desktop/ex$

Добавлено через 5 минут
Природу вывода 2 4эксперемента и предположить не могу
Для остальных предполагаю ,что по окончанию вывода 1го printf второй поток завершил работу
,но такой же результат если я ставлю циклы перед созданием второго потока , то есть основной поток должен быть медленнее


Как я думаю основной поток с вновь созданными как то на равне ,или я не прав
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
19.11.2014, 14:41
Ну вот так поиедее должен быть хаос... Может быть невсегда, но должен быть... Можете еще после каждого printf добавить fflush(NULL). И чем больше циклы, тем больше хаоса.

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
#include <stdio.h>
#include <pthread.h>
 
int shared = 0;
 
void *f(void *arg) {
    for (int i = 0; i < 10; i++) {
        shared = 999;
        printf("child thread %i\n", shared);
    }
    return 0;
}
 
int main(int argc, char *argv[]) {
    pthread_t child;
    pthread_create(&child, NULL, f, NULL);
 
    for (int i = 0; i < 10; i++) {
        shared = 111;
        printf("main thread %i\n", shared);
    }
 
    pthread_join(child, NULL);
    return 0;
}
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
19.11.2014, 15:17  [ТС]
grgdvo,

C
1
2
3
for(int i = 0; i < 10; i++) 
        shared = 111;
        printf("main thread %i\n", shared);

Писал это так ,чтобы время исполнения увеличить
мне не ясно почему , выводиться 111 первым
когда там цикл ,ңоторый заведомо дольше чем функция

Хаос да , но под ним я подразумевал то ,что
если бы эти функций были черными ящиками то хаос

а когда так оячевидно ,кто дольше кого работает и тут результат не совпадает с моими ожиданиями
да и ище непонятные исходы (2,4 в экспериментах)

Все таки мне казалось , что распределение этого самого хаоса должно быть предсказуемым

Добавлено через 2 минуты
grgdvo, я кажеться понимаю

потоки исполняею весь код ,как попало
т е сперва один потом дроугой энное количество раз

поэтому такие результаты

Спасибо
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
19.11.2014, 15:27
Цитата Сообщение от Qazan Посмотреть сообщение
я хочу получить пример , когда перед каждм запуском программы я получаю разные режзультаты
Процедуры sleep и rand отменили? Типа того:

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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
 
int shared = 0;
 
void
slp(int m)
{
    sleep(rand()%m + 1);
}
 
void
foo(char *t, int v)
{
    slp(10);
    printf("%s thread before: %i\n", t, shared);
    slp(5);
    shared = v;
    printf("%s thread after:  %i\n", t, shared);
}
 
void*
f(void *arg)
{
    foo("child", 999);
    return NULL;
}
 
int
main(void)
{
    int i;
    pthread_t child;
 
    srand(time(NULL));
    pthread_create(&child, NULL, f, NULL);
 
    foo("main", 111);
 
    sleep(15);
    pthread_join(child, NULL);
    return 0;
}
не?
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
19.11.2014, 23:28  [ТС]
grgdvo, результаты таковы
в эксперементах
основной поток всегда выполняеться первым , потом дочерний

Опять двадцать пять .

Добавлено через 7 минут
korvin_, rand() то мне зачем ,
я хочу получить разные результаты гонок

В нынешних эксперементах , не получалоьс этого добиться
подозреваю ,что дело было в оптимизациях копилятора

Добавлено через 7 часов 52 минуты
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
#include <stdio.h>
#include <pthread.h>
 
int shared = 0;
pthread_mutex_t mutex;
 
void * f(void * arg){
 int i;
 for(i = 0;i < 100;i++)  printf("*");
 return 0;
}
 
int main(){
 
 pthread_mutex_t mutex;
 pthread_t pthread;
 pthread_create(&pthread,NULL,f,NULL);
 
 int i;
 for(i = 100;i < 200;i++) printf("o");
 
 pthread_join(pthread,NULL);
 return 0;
}

Воот ,это то ,что я ждал :
XML
1
o*oooooooooo**o**o**o**o**oooo*o**o**ooo*o*ooo*o*ooo*o**ooo*o**oo*o**o**o**o**ooo*o***o**o**ooo*o***o**o**ooo*o**ooo*o***o**o***o**o**ooo*o**ooo*o***o***o**o**o**ooo*o***o**o**ooo*o***o**o**ooo*oooooo
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
20.11.2014, 17:23
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Qazan Посмотреть сообщение
Воот ,это то ,что я ждал :
Code
1
o*oooooooooo**o**o**o**o**oooo*o**o**ooo*o*ooo*o*ooo*o**ooo*o**oo*
1. printf - потоконебезопасно ==> на него mutex, и не помешает проталкивать буфер.
2. У тебя в коде с мютексами, они объявлялись дважды
3. Сделай паузу между выводом на экран, что бы успевали переключаться потоки, а то твои циклы они быстро обработают.
4. На создание потока нужно время, pthread_create отрабатывает на много раньше, чем начнётся выполняться новый поток ==> главный поток много чего ещё успеет сделать.
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
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
 
pthread_mutex_t mutex_stdout;
 
void * print_dots(void *arg) {
    int i, j, seed;
    for(i=0; i<20; ++i) {
        pthread_mutex_lock(&mutex_stdout);
        printf("*");
        fflush(stdout);
        pthread_mutex_unlock(&mutex_stdout);
        usleep(100);
    }
    pthread_exit(NULL);
}
 
 
int main() {
    pthread_t pthread;
    int i;
 
    pthread_mutex_init(&mutex_stdout, NULL);
    pthread_create(&pthread, NULL, print_dots, NULL);
    for(i=0; i<20; ++i) {
        pthread_mutex_lock(&mutex_stdout);
        printf("0");
        fflush(stdout);
        pthread_mutex_unlock(&mutex_stdout);
        usleep(100);
    }
    pthread_join(pthread, NULL);
    pthread_mutex_destroy(&mutex_stdout);
    return 0;
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2014, 17:23
Помогаю со студенческими работами здесь

Как по нажатию на кнопку создать новый поток
Мне нужно организовать выход из безконечного цикла. Пока не нажата кнопка №2 выполняется цикл, который запускается кнопкой №1. void...

Создать новый поток на добавление элементов в коллекцию
Доброго времени суток. Имеется приложение которое определяет является ли bitInteger из задаваемого промежутка простым числом. В цикле...

Составить блок-схему для небольшого участка кода
Всем привет. Помогите, пожалуйста, сделать блок схему для этого куска кода for(int i = 0;i &lt; 9;i++) { int min = array; int...

Как записать регулярное выражения для этого участка кода?
&lt;td&gt;USD&lt;/td&gt; &lt;td&gt;56.16&lt;/td&gt; &lt;td&gt;56.79&lt;/td&gt; пытался так ...

Создать новый поток, генерирующий ряд Фибоначчи из 10-ти членов, используя рекурсивный алгоритм
Написать программу, которая создает новый поток, что генерирует ряд Фибоначи с 10-ти членов, используя рекурсивный алгоритм.


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru