나는 을 호출하기 전에 pthread
의 속성을 설정하는 함수를 만들었습니다. 그러나 pthread_create()
은 0이 아닌 값을 반환하므로 실패합니다. 내 기능으로 설정된 속성이 무엇이 잘못된 것인지 잘 모르겠습니다. 내 프로그램을 g++
(Ubuntu 16.04 LTS
)으로 컴파일 중입니다.,814에 perror()
인쇄 문자 배열 Operation not permitted
를 호출pthreads_create()가 0이 아닌 값을 반환합니까?
: -
typedef void *(*DART_TASK_T)(void *);
typedef void (*DART_CALLBACK_T)(int);
static struct taskcontrolblock_s sysTask[MAX_DARTOS_THREADS];
static unsigned max_task_id_registered = 0;
static std :: bitset<sizeInBytes(MAX_DARTOS_THREADS)> taskIDs;
struct taskcontrolblock_s {
const char *name;
DART_TASK_T routine;
DART_CALLBACK_T cleanup_callback;
void *arg;
unsigned arg_len;
union {
uint8_t flags;
struct {
//uint8_t created:1;
//uint8_t running:1;
//uint8_t blocked:1;
//uint8_t suspended:1;
//uint8_t killed:1;
//uint8_t completed:1;
//uint8_t;
};
};
int priority;
pthread_t thread;
}__attribute__((packed));
static int dispatch_task(int tid)
{
if (!taskIDs[tid]) //
return -1;
pthread_attr_t attr;
struct sched_param param;
param.sched_priority = sysTask[tid].priority;
int policy = SCHED_RR;
if (pthread_attr_init(&attr))
return -1;
if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED))
return -1;
if (pthread_attr_setschedpolicy(&attr, policy))
return -1;
if (pthread_attr_setschedparam(&attr, ¶m))
return -1;
if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM))
return -1;
if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))
return -1;
if (pthread_create(&sysTask[tid].thread, &attr, sysTask[tid].routine, sysTask[tid].arg))
return -1;
pthread_attr_destroy(&attr);
return 0;
}
편집
g++ example.cpp -lpthread
./a.out
:
내가 사용하고 컴파일하고 실행하려면.
루트 권한으로 프로그램을 실행하면 문제가 해결되었습니다.
'struct sched_param param'의 일부 멤버를 초기화하지 않은 채로 남겨두고 있습니다. –
무엇이 잘못되었는지 이해하는 데 도움이되는 오류의 원인을 표시하려면 perror()를 사용하십시오. –
루트 사용자 만 스케쥴러를 SCHED_RR – nos