Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Linux WinAPI в Linux) https://www.cyberforum.ru/ cpp-linux/ thread822989.html
понимаю глупый вопрос но всетаки. нужна помощь для аналогов WinAPI в Linux. Пробовал копать в сторону fork () но так и не смог привести к нормальному виду как CreateProcess (); ... даже незнаю в каком разделе писать пост думал в разделе Виндовс, но все-таки написал сюда. изложения кода написанной программы под виндовс ... спасибо #include <iostream> #include <conio.h> #include <windows.h>...
C++ Linux Взаимодействие процессов и скриптик (баш) и ещё
Здравствуйте! В задания входит - взаимодействие процессов( спомощью сокетов, сообщений и тд) Так же помощь в написании скрипта( баш) Тк сроки поджимают нужен человек, который в этом уже разбирается. За помощь полагается благодарность в виде ценных бумаг. Кто может помочь - просьба писать в личку. Спасибо
C++ Linux Подсчет контрольной суммы файла https://www.cyberforum.ru/ cpp-linux/ thread822537.html
Подсчет контрольной суммы файла (суммы байт по модулю 256). Нить считывает участок файла и считает его сумму. Результаты складываются.
C++ Linux Процессы и передача данных Всем привет. Написал программу #include <alloca.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <time.h> #include <fcntl.h> #include <sys/wait.h> https://www.cyberforum.ru/ cpp-linux/ thread822368.html
Не удаляется процесс C++ Linux
Написать программу, которая следит и перезапускает в случае завершения работы заданное количество приложений. Полный путь к приложениям хранится в массиве. #include <unistd.h> #include <sys/wait.h> #include <stdio.h. void run(char process) { while(true) { pid_t pid = fork(); if (pid == -1) {
C++ Linux не могу понять код есть такой фрагмент кода: /* test.cpp */ template <typename T> struct MyClass { static const int param = sizeof(T); }; template <> struct MyClass<int> { static const int param = 100; https://www.cyberforum.ru/ cpp-linux/ thread821424.html
C++ Linux Перегрузка драйвера сетевого устройсвта https://www.cyberforum.ru/ cpp-linux/ thread821215.html
Программа должна перезагрузить драйвер сетевого устройства. Хочется узнать можно ли это сделать и если можно то как? Добавлено через 27 минут Правильно ли я понимаю, что управлять сетевым устройством в Linux надо с помощью: ioctl(sockFd, SIOCGIFFLAGS, &ifr); ifr.ifr_flags |= IFF_UP; // |= ~IFF_DOWN в случае отключения ioctl(sockFd, SIOCSIFFLAGS, &ifr);
Получение pthread_t из терминала C++ Linux
Суть такова: нужно получить список потоков процесса с их pthread_t наподобие ps -Lf но нужны именно pthread_t, а не tid(lwp). Я писал лабу по потокам, преподаватель хочет видеть при остановленной программе(^Z) вывод списка потоков с их pthread_t. Я гуглил, грепил по ману)), но так и не смог найти чего-либо подобного. Вообще, по-моему мнению, сделать этого нельзя, т.к. данный...
C++ Linux запись видео https://www.cyberforum.ru/ cpp-linux/ thread819895.html
С помощью Video for Linux 2 читаю видео фрейм с камеры в массив unsigned char data в формате RGB24. Подскажите как можно закодировать видео в файл, желательно с примером.
C++ Linux Работа одновременно с двумя сокетами https://www.cyberforum.ru/ cpp-linux/ thread818697.html
В общем возникла такая проблема, к серверу могут подключаться одновременно множество клиентов двух разных типов. Под каждый из типов я создаю отдельный сокет на отдельный порт. И возник такой вопрос, как определить какой из дескрипторов от accept мне надо брать, чтобы вызывать методы для обработки подключения? const int NUMPROC = 3; // ретранслятор c предварительным fork (pefork) int main(...
C++ Linux Как определить имя хоста?
типа: char = hostname(); ?
C++ Linux Многомерный массив В общем купил себе Raspberry, Си знаком только на пальцах. Может я тип неправильно указываю или что. ... static int rus_font = {{0x18,0x3C,0x7E,0x18,0x18,0x7E,0x3C,0x18},{0x3E,0x63,0x38,0x6C,0x6C,0x38,0xCC,0x78}}; int i; for(i = 0; i == 8; i++) { m_send((),rus_font); }; https://www.cyberforum.ru/ cpp-linux/ thread817646.html
3 / 3 / 0
Регистрация: 14.09.2012
Сообщений: 84
28.04.2013, 22:17  [ТС] 0

Semaphore - C++ Linux - Ответ 4485372

28.04.2013, 22:17. Показов 1730. Ответов 5
Метки (Все метки)

Ответ

Ошибки при сборке исправил, но все равно на каком-то моменте прога зависает и ожидает освобождения мьютекса.

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
 
typedef struct ELEMENT_STRUCT
{
    int data;
    pthread_mutex_t mutex;
} ELEMENT;
 
void Init(ELEMENT *arr, int arr_size, int min, int max);
 
int main(int argc, const char *argv[])
{
    if (argc != 4) {
        printf("Syntax: Semaphore <number_count> <min_number> <max_number>");
        return 0;
    }
 
    srand(time(NULL));
 
    int arr_size = atoi(argv[1]);
    int arr_min = atoi(argv[2]);
    int arr_max = atoi(argv[3]);
 
    int shm_id = shmget(IPC_PRIVATE, sizeof(ELEMENT)*arr_size + sizeof(int), 0666);
    if (shm_id == -1) {
        printf("error: shmget()");
        return -1;
    }
 
    int *busy_flag = (int*)shmat(shm_id, NULL, 0);
    ELEMENT *arr = (ELEMENT*)++busy_flag;
    if (*busy_flag == -1) {
        printf("error: shmat()");
        return -1;
    }
    
    
    Init(arr, arr_size, arr_min, arr_max);
 
    pid_t pid = fork();
    if (pid < 0) {
        printf("error: fork()");
        return -1;
    }
 
    if (pid == 0) {
        //bubble sort
        ELEMENT tmp;
        for (int i = arr_size - 1; i > 0; --i) {
            for (int j = 0; j < i; ++j) {
                if (arr[j].data > arr[j+1].data) {
                    pthread_mutex_lock(&arr[j].mutex);
                    pthread_mutex_lock(&arr[j+1].mutex);
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    pthread_mutex_unlock(&arr[j+1].mutex);
                    pthread_mutex_unlock(&arr[j].mutex);
                }
            }
        }
    }
 
    if (pid > 0) {
        int iteration_number = 0;
 
        do {
            printf("\n\niteration: %d\n", iteration_number);
            for (int i = 0; i < arr_size; ++i) {
                if (pthread_mutex_trylock(&arr[i].mutex) == EBUSY) {
                    pthread_mutex_lock(&arr[i].mutex);
                    printf("%d, locked\n", arr[i].data);
                    pthread_mutex_unlock(&arr[i].mutex);
                } else {
                    printf("%d, unlocked\n", arr[i].data);
                }
            }
        }
        while (*busy_flag);
 
        for (int i = 0; i < arr_size; ++i) {
            printf("%d ", arr[i].data);
            pthread_mutex_destroy(&arr[i].mutex);
        }
                   
        shmctl(shm_id, IPC_RMID, NULL);
    }
 
    return 0;
}
 
void Init(ELEMENT *arr, int arr_size, int min, int max) {
    for (int i = 0; i < arr_size; ++i) {
        pthread_mutexattr_t mattr;
        pthread_mutexattr_init(&mattr);
        pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
        
        pthread_mutex_init(&arr[i].mutex, &mattr);
        arr[i].data = rand() % max + min;
    }
}
Добавлено через 11 минут
Кое что еще раз исправил, но не работает как надо.

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sem.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
 
typedef struct ELEMENT_STRUCT
{
    int data;
    pthread_mutex_t mutex;
} ELEMENT;
 
void Init(ELEMENT *arr, int arr_size, int min, int max);
 
int main(int argc, const char *argv[])
{
    if (argc != 4) {
        printf("Syntax: Semaphore <number_count> <min_number> <max_number>");
        return 0;
    }
 
    srand(time(NULL));
 
    int arr_size = atoi(argv[1]);
    int arr_min = atoi(argv[2]);
    int arr_max = atoi(argv[3]);
 
    int shm_id = shmget(IPC_PRIVATE, sizeof(ELEMENT)*arr_size + sizeof(int), 0666);
    if (shm_id == -1) {
        printf("error: shmget()");
        return -1;
    }
 
    int *busy_flag = (int*)shmat(shm_id, NULL, 0);
    ELEMENT *arr = (ELEMENT*)++busy_flag;
    if (*busy_flag == -1) {
        printf("error: shmat()");
        return -1;
    }
    
    
    Init(arr, arr_size, arr_min, arr_max);
    *busy_flag = 0
 
    pid_t pid = fork();
    if (pid < 0) {
        printf("error: fork()");
        return -1;
    }
 
    if (pid == 0) {
        //bubble sort
        ELEMENT tmp;
        for (int i = arr_size - 1; i > 0; --i) {
            for (int j = 0; j < i; ++j) {
                if (arr[j].data > arr[j+1].data) {
                    pthread_mutex_lock(&arr[j].mutex);
                    pthread_mutex_lock(&arr[j+1].mutex);
                    tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    pthread_mutex_unlock(&arr[j+1].mutex);
                    pthread_mutex_unlock(&arr[j].mutex);
                }
            }
        }
     *busy_flag = 1;
    }
 
    if (pid > 0) {
        int iteration_number = 0;
 
        do {
            printf("\n\niteration: %d\n", iteration_number);
            for (int i = 0; i < arr_size; ++i) {
                if (pthread_mutex_trylock(&arr[i].mutex) == EBUSY) {
                    pthread_mutex_lock(&arr[i].mutex);
                    printf("%d, locked\n", arr[i].data);
                    pthread_mutex_unlock(&arr[i].mutex);
                } else {
                    printf("%d, unlocked\n", arr[i].data);
                }
            }
        }
        while (*busy_flag);
 
        for (int i = 0; i < arr_size; ++i) {
            printf("%d ", arr[i].data);
            pthread_mutex_destroy(&arr[i].mutex);
        }
                   
        shmctl(shm_id, IPC_RMID, NULL);
    }
 
    return 0;
}
 
void Init(ELEMENT *arr, int arr_size, int min, int max) {
    for (int i = 0; i < arr_size; ++i) {
        pthread_mutexattr_t mattr;
        pthread_mutexattr_init(&mattr);
        pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
        
        pthread_mutex_init(&arr[i].mutex, &mattr);
        arr[i].data = rand() % max + min;
    }
}


Вернуться к обсуждению:
Semaphore C++ Linux
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2013, 22:17
Готовые ответы и решения:

Объясните как работает Semaphore
При задании минимального кол-во запросов(5), как я понимаю семафор выполнит действие, если запросов...

Semaphore Wait(int millisecondsTimeout)
Добрый день. Разбираюсь в многопоточном программировании. Скажите пожалуйста, что именно означает...

Не могу найти класс Semaphore
Куда то делся етот классс. Студия 2012 Express. Когда пишу Semaphore подчекркивает красной...

Какое назначение у параметров Semaphore Constructor?
Имеется такой код применения семафора. using System; using System.Threading; // Этот поток...

5
28.04.2013, 22:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2013, 22:17
Помогаю со студенческими работами здесь

Как реализовать многопоток? (возможно Semaphore)
Здравствуйте, есть задача выполнять некий кусок кода разными небольшими программами в несколько...

Синхронизация потоков при использовании semaphore
Доброго времени суток! Есть глобальный массив. Есть два потока (main и second). Main выводит...

Сделать консольную программу парковки автомобилей используя класс Semaphore
Никак немогу совсем разобратсья c задачей .Нужно сделать консольную программу парковки автомобилей...

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