#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.