Сломать предел нарезки резьбы, ошибка сегментации - PullRequest
0 голосов
/ 29 мая 2010

используйте pthread_create для создания ограниченного числа одновременно работающих потоков Успешно скомпилируйте и запустите

Однако после добавления массива указателей функций для запуска функции ошибка сегментации

Где не так?

номер рабочего сервера: 0 Ошибка сегментации

void* workserver(void *arg)
{
int status;
while(true)
{
    printf("workserver number: %d\n", (int)arg);
    (* job_queue[(int)arg])();
    sleep(3);

    status = pthread_mutex_lock(&data.mutex);
    if(status != 0)
        printf("%d lock mutex", status);
    data.value = 1;
    status = pthread_cond_signal(&data.cond);
    if(status != 0)
        printf("%d signal condition", status);
    status = pthread_mutex_unlock(&data.mutex);
    if(status != 0)
        printf("%d unlock mutex", status);
}
}


void jobadd(void (*job)())
{   
    for(int i; i<3; i++)
    {
        if(idle[i] == 0)
        {
            job_queue[i] = job;
            job;
            idle[i] = 1;
        }
    }
}
void func1()
{
    printf("func1 run");
}
void func2()
{
    printf("func2 run");
}
void func3()
{
    printf("func3 run");
}
void func4()
{
    printf("func4 run");
}

int main(int argc, char* argv[])
{
    jobadd(func1);
    jobadd(func2);
    jobadd(func3);
    jobrun();
    return 0;
}

инициализировать массив указателей на функцию с помощью jobadd

Ответы [ 2 ]

0 голосов
/ 30 мая 2010

После размещения массива указателей на функции (* job_queue[(int)arg])(); в конце он может успешно вызвать функцию со следующим результатом, даже если я добавлю бесконечный цикл и сон в func1, он не будет блокироваться при func1

Сейчас я работаю над тем, как заменить существующую работающую функцию новой функцией, используя pthread_cleanup_push и pop

  • номер рабочего сервера: 0 func1 run
  • номер рабочего сервера: 2 func3 run
  • номер рабочего сервера: 1 запуск func2
  • номер рабочего сервера: 0 func1 run
  • номер рабочего сервера: 2 func3 run
  • номер рабочего сервера: 1 запуск func2
  • номер рабочего сервера: 2 рабочих сервера
  • число: 0 func3 run func1 run
  • номер рабочего сервера: 1 запуск func2
  • номер рабочего сервера: 0 рабочий сервер
  • число: 2 func1 run func3 run
  • номер рабочего сервера: 1 запуск func2
  • номер рабочего сервера: 2 рабочих сервера
  • число: 0 func3 run func1 run
  • номер рабочего сервера: 1 запуск func2
  • номер рабочего сервера: 0 рабочий сервер
  • номер: 2 func1 run func3 run
  • номер рабочего сервера: 1 запуск func2

    в то время (правда) { printf («номер рабочего сервера:% d \ n», (int) arg);

    status = pthread_mutex_lock(&data.mutex);
    
    //pthread_cleanup_push(
    
    if(status != 0)
         printf("%d lock mutex", status);
    data.value = 1;
    status = pthread_cond_signal(&data.cond);
    if(status != 0)
        printf("%d signal condition", status);
    status = pthread_mutex_unlock(&data.mutex);
    if(status != 0)
        printf("%d unlock mutex", status);
    
    (* job_queue[(int)arg])();
    sleep(1);
    void (* clean)(void *);
    clean = NULL;
    /*
    for(int i=0; i<4; i++)
    {
        if(idle[i] == 0)
        {
            if(fp[(int)arg] != NULL)
            {
                idle[running_number[(int)arg]] = 0; // replace its running job
                clean = fp[(int)arg];
                fp[(int)arg] = job_queue[i];
                pthread_cleanup_push(clean, NULL);
                (*fp[(int)arg])();
                pthread_cleanup_pop(1);
    
                idle[i] = 1;
            }
            else
            {
                fp[(int)arg] = job_queue[i];
                idle[i] = 1;
                running_number[(int)arg] = i;
                (*fp[(int)arg])();
            }
        }
    }*/
    

    }

0 голосов
/ 30 мая 2010

добавить больше деталей в вопросе

job_queue[i] = job

просто назначьте функцию массиву указателей на функции

as не может назначить массив указателей на функции непосредственно в pthread_create

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...