код ошибки 3029 pthread на as400 / IBM I?

#c #multithreading #pthreads #ibm-midrange

#c #многопоточность #pthreads #ibm-средний диапазон

Вопрос:

У меня есть следующий источник C:

 #define _MULTI_THREADED
#include <pthread.h>
#include <stdio.h>

void* threadfunc(void* parm){
    printf("Hello thread.n");
    pthread_exit(NULL);
}

int main(int argc, char* argv[]){
    pthread_t t;
    int rc;
    rc = pthread_create(amp;t, NULL, threadfunc, NULL);
    printf("Create return code: %in", rc);
    if(!rc){
        pthread_join(t, NULL);
    }
    return 0;
}
  

Скомпилирован с crtbndc pgm(test) srcfile(myfile) srcmbr(test)

При вызове с call test помощью, я получаю вывод:

Создать код возврата: 3029

Что означает этот код ошибки?

Ответ №1:

Согласно документации IBM i, pthreads, похоже, не поддерживается:

Сбой при создании потока (pthread_create()) с помощью EBUSY или 3029

Поскольку многие части операционной системы еще не являются потокобезопасными, не каждое задание может запускать потоки. API pthread_create() завершается ошибкой EBUSY, когда процессу не разрешено создавать потоки. Информацию о том, как запустить задание, которое может создавать потоки, см. в разделе Запуск многопоточных программ.

И это предлагает несколько альтернатив.

Комментарии:

1. Я собирался опубликовать свой следующий вопрос, но, поскольку я могу публиковать сообщения только раз в 90 минут, я задам его здесь. Я попробовал одну из альтернатив, которая заключается в запуске задания с помощью команды SBMJOB, но этот способ не выводит вызовы печати заданий на мой экран. Как мне заставить задание, запущенное с помощью SBMJOB, выводиться на мой экран, как если бы оно вызывалось напрямую с помощью команды CALL ?

2. Отправленное задание выполняется в пакетном режиме отдельно от локальной рабочей станции, и в отличие от * nix, IBM i, будучи объектно-ориентированным, не обрабатывает все как файл , который можно открыть, поэтому терминал не может быть так легко записан из другого задания, как это могло бы быть в случае с другимОС. Вероятно, проще всего попробовать другую из предложенных альтернатив ; в частности, использовать QSH для инициализации test.pgm после ADDENVVAR QIBM_MULTI_THREADED 'Y'

Ответ №2:

Коды возврата ошибок легче всего интерпретировать, просмотрев описание сообщения для соответствующего идентификатора сообщения. Используйте префикс ‘CPE’ с кодом возврата символа ‘3029’. Итак, для этого см. Эту команду:

 DSPMSGD CPE3029
  

В этом случае текст 1-го уровня — «Ресурс занят». Вероятно, это относится к файлу / устройству отображения, которое уже активно используется и выделено для основного потока задания (при условии, что ВЫЗОВ был выполнен в интерактивном задании).

В программе вы можете просмотреть раздел Проверка значения Errno в Руководстве программиста ILE по C / C . Также следует проверить элемент ERRNO в исходном файле H в библиотеке QSYSINC.

Кроме того, в Центре знаний находится таблица значений Errno для функций типа UNIX.