Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pthread tigger 
:(
    Опции темы
UserNet
Дата 16.8.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Народ есть программа у которой 3 потока, два потока добавляют элементы в массив, а третьий поток в случае добавления элемента, выводи массив на экран.
Два вопроса
1)Правильно ли реальзованы mutex в этой программе, для доступа двух потоков к одному массиву?
2)Как сделать триггер для потока?
Код

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>

int        n = 12,   *arr;
pthread_mutex_t insert_mutex = PTHREAD_MUTEX_INITIALIZER;
int 
insertarr(int value)
{
    int        i         , num;
    pthread_mutex_lock(&insert_mutex);
    for (i = 0; i < 2 * n; i++) {
        if (arr[i] == -1) {
            num = i;
            break;
        }
    }
    arr[num] = value;
    pthread_mutex_unlock(&insert_mutex);    
    return 0;
}

void           *
thread_proc_one(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id1 value = %i \n", tmp);
        insertarr(tmp);
    }

    return NULL;
}

void           *
thread_proc_two(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id2 value = %i \n", tmp);
        insertarr(tmp);
    }
    return NULL;
}
void           *
thread_proc_thr(void *data)
{
    int        i;
    printf("\narray = ");
    for (i = 0; i < 2 * n; i++) {
    
        printf("%i ",arr[i]);
    }

    printf("\n");
    return NULL;
}

int
main(int argc, char *argv[])
{
    int        i;
    pthread_t    thread_one, thread_two, thread_thr;
    srand(time(NULL));
    arr = calloc(24, sizeof(int));
    for (i = 0; i < 2 * n; i++)
        arr[i] = -1;
    pthread_create(&thread_one, NULL, &thread_proc_one, NULL);
    pthread_create(&thread_two, NULL, &thread_proc_two, NULL);
    pthread_create(&thread_thr, NULL, &thread_proc_thr, NULL);
    pthread_join(thread_one, NULL);
    pthread_join(thread_two, NULL);
    pthread_join(thread_thr, NULL);
    return 0;
}


PM MAIL   Вверх
boostcoder
Дата 16.8.2010, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(UserNet @  16.8.2010,  20:15 Найти цитируемый пост)
1)Правильно ли реальзованы mutex в этой программе, для доступа двух потоков к одному массиву?

да.

Цитата(UserNet @  16.8.2010,  20:15 Найти цитируемый пост)
2)Как сделать триггер для потока?

что имеется в виду?
PM WWW   Вверх
UserNet
Дата 16.8.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Про триггер имется ввиду следующие:
Произошло добавление элемента в массив,то есть сработала функция insertarr(int value),
запустился третьи поток, вывел элементы массива на экран, иначе третьий поток ожидает.
PM MAIL   Вверх
djamshud
Дата 16.8.2010, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



UserNet, 2 - use semaphore, Luke.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 16.8.2010, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(UserNet @  16.8.2010,  20:24 Найти цитируемый пост)
Произошло добавление элемента в массив,то есть сработала функция insertarr(int value),
запустился третьи поток, вывел элементы массива на экран, иначе третьий поток ожидает. 

это: https://computing.llnl.gov/tutorials/pthrea...ditionVariables
PM WWW   Вверх
UserNet
Дата 16.8.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Попробовал переписать по примеру, поток который выводит на экран работает только один раз.
Код

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>

int        n = 12,   *arr;
pthread_mutex_t insert_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t    view =  PTHREAD_COND_INITIALIZER;
int 
insertarr(int value)
{
    int        i         , num;
    pthread_mutex_lock(&insert_mutex);
    for (i = 0; i < 2 * n; i++) {
        if (arr[i] == -1) {
            num = i;
            break;
        }
    }
    arr[num] = value;
    pthread_cond_signal(&view);
    pthread_mutex_unlock(&insert_mutex);    
    sleep(1);
    return 0;
}

void           *
thread_proc_one(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id1 value = %i \n", tmp);
        insertarr(tmp);
    }

    return NULL;
}

void           *
thread_proc_two(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id2 value = %i \n", tmp);
        insertarr(tmp);
    }
    return NULL;
}
void           *
thread_proc_thr(void *data)
{
    int        i;
    printf("view thread");
    pthread_mutex_lock(&insert_mutex);
    pthread_cond_wait(&view, &insert_mutex);
    printf("\narray = ");
    for (i = 0; i < 2 * n; i++) {
    
        printf("%i ",arr[i]);
    }

    printf("\n");
    pthread_mutex_unlock(&insert_mutex);
    return NULL;
}

int
main(int argc, char *argv[])
{
    int        i;
    pthread_t    thread_one, thread_two, thread_thr;
    srand(time(NULL));
    arr = calloc(24, sizeof(int));
    for (i = 0; i < 2 * n; i++)
        arr[i] = -1;
    pthread_mutex_init(&insert_mutex, NULL);
    pthread_cond_init (&view, NULL);
    
    pthread_create(&thread_one, NULL, &thread_proc_one, NULL);
    pthread_create(&thread_two, NULL, &thread_proc_two, NULL);
    pthread_create(&thread_thr, NULL, &thread_proc_thr, NULL);
    pthread_join(thread_one, NULL);
    pthread_join(thread_two, NULL);
    pthread_join(thread_thr, NULL);
    return 0;
}

PM MAIL   Вверх
boostcoder
Дата 16.8.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



так:
Код

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
int        n = 12,   *arr;
pthread_mutex_t insert_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t    view =  PTHREAD_COND_INITIALIZER;
int
insertarr(int value)
{
    int        i         , num;
    pthread_mutex_lock(&insert_mutex);
    for (i = 0; i < 2 * n; i++) {
        if (arr[i] == -1) {
            num = i;
            break;
        }
    }
    arr[num] = value;
    pthread_cond_signal(&view);
    pthread_mutex_unlock(&insert_mutex);    
    sleep(1);
    return 0;
}
void           *
thread_proc_one(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id1 value = %i \n", tmp);
        insertarr(tmp);
    }
    return NULL;
}
void           *
thread_proc_two(void *data)
{
    int        i         , tmp;
    for (i = 0; i < n; i++) {
        tmp = rand() % 100;
        printf("id2 value = %i \n", tmp);
        insertarr(tmp);
    }
    return NULL;
}
void           *
thread_proc_thr(void *data) {
   while (1) { /* придумай способ завершения цикла */
      int        i;
      printf("view thread");
      pthread_mutex_lock(&insert_mutex);
      pthread_cond_wait(&view, &insert_mutex);
      printf("\narray = ");
      for (i = 0; i < 2 * n; i++) {

         printf("%i ",arr[i]);
      }
      printf("\n");
      pthread_mutex_unlock(&insert_mutex);
   }
   return NULL;
}
int
main(int argc, char *argv[])
{
    int        i;
    pthread_t    thread_one, thread_two, thread_thr;
    srand(time(NULL));
    arr = calloc(24, sizeof(int));
    for (i = 0; i < 2 * n; i++)
        arr[i] = -1;
    pthread_mutex_init(&insert_mutex, NULL);
    pthread_cond_init (&view, NULL);
    
    pthread_create(&thread_one, NULL, &thread_proc_one, NULL);
    pthread_create(&thread_two, NULL, &thread_proc_two, NULL);
    pthread_create(&thread_thr, NULL, &thread_proc_thr, NULL);
    pthread_join(thread_one, NULL);
    pthread_join(thread_two, NULL);
    pthread_join(thread_thr, NULL);
    return 0;
}


PM WWW   Вверх
UserNet
Дата 16.8.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.