2016-12-20 3 views
0

나는 을 호출하기 전에 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, &param)) 
     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 

:

내가 사용하고 컴파일하고 실행하려면.

루트 권한으로 프로그램을 실행하면 문제가 해결되었습니다.

+2

'struct sched_param param'의 일부 멤버를 초기화하지 않은 채로 남겨두고 있습니다. –

+2

무엇이 잘못되었는지 이해하는 데 도움이되는 오류의 원인을 표시하려면 perror()를 사용하십시오. –

+2

루트 사용자 만 스케쥴러를 SCHED_RR – nos

답변

2

대답의 첫 번째 부분은 SCHED_RR을 사용하려면 사용자에게 CAP_SYS_NICE이 있어야합니다. 앞서 말씀 드렸듯이 root으로 실행하면 효과가 있습니다. 그러나 CAP_SYS_NICE "기능을 가진 한 모든 사용자로 실행할 수 있습니다." 이를 얻는 한 가지 방법은 여기에 설명되어있는 을 사용하는 것입니다. https://stackoverflow.com/a/37528755/4323

sudo setcap을 실행해야합니다.

관련 문제