Как вызвать поток C языка через JNI Technology в Android (пример семафора PV операции) - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу использовать пример семафора операции PV в Android, но когда я выполню свой код, программа вернётся sh и скажет, что есть фатальный сигнал:

Fatal signal 5 (SIGTRAP), code 1 in tid 23992 (.***.***)
I/libc: Another thread contacted debuggerd first; not contacting debuggerd.

Моя цель - показать в коде: прибытие клиента -> клиент начинает получать услугу (займет некоторое время) -> клиент завершает получение услуги. Если я запускаю Java, программа вернется sh назад. Если я использую отладку, я нахожу, что каждый раз, когда я выполняю следующую инструкцию перед созданием последнего потока

int customer_id=i;

Программа не будет работать, и мой компьютер переместится в верхнюю часть файла cpp .

Вот мой код

sem_t sem;
#define CUSTOMER_NUM 5
std::string results = "";


void *get_service(void *thread_id)
{
    int customer_id=(int)(*((int *)thread_id));

    if(sem_wait(&sem)==0)
    {

        //output
        std::string strBuf1 = "custom ";
        strBuf1.append(customer_id+" begin receive serice\n");
        results.append(strBuf1);
        usleep(41) ;
        std::string strBuf2 = "custom ";
        strBuf2.append(customer_id+" finish receive serice\n");
        results.append(strBuf2);
        sem_post(&sem);
    }
}


extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_mybysj_ui_dashboard_DashboardFragment_getSemResult(JNIEnv *env, jclass clazz) {

    sem_init(&sem,0,2);
    pthread_t customers[CUSTOMER_NUM];


    int i,iRet;
    for(i=0;i<CUSTOMER_NUM;i++)
    {
        int customer_id=i;
        iRet=pthread_create(&customers[i],
                            NULL,
                            get_service,
                            &customer_id);
        if(iRet != 0)
        {
            return env->NewStringUTF("error");
        }else{
            std::string strBuf = "custom";
            strBuf.append(i+"arrive\n");
            results.append(strBuf);
        }

        usleep(10);
    }
    int j;
    for(j=0;j<CUSTOMER_NUM;j++)
    {
        pthread_join(customers[j],NULL);
    }
    sem_destroy(&sem);

    char strBuf[10000] = {' '};
    sprintf(strBuf, "%s", results.c_str());
    return env->NewStringUTF(strBuf);

}

Используйте toast для отображения результатов в Andros, возвращая strBuf

Если приведенный выше пример сложен для понимания, у меня есть другой пример

#define P sem_wait
#define V sem_post
#define full_apple &fullA
#define full_orange &fullB
#define empty &empty_aha


sem_t fullA;
sem_t fullB;
sem_t empty_aha;
int num = 0;
std::string results = "";

void *Dad(void *p) {
    while (num < 5) {
        P(empty);
        num++;
        results.append("dad put a apple\n");
        V(full_apple);
    }
}


void *Dangter(void *p) {
    while (num < 5) {
        P(full_apple);
        num++;
        results.append("daughter eat a apple\n");

        V(empty);
    }
}

void *Mum(void *p) {
    while (num < 5) {
        P(empty);
        num++;
        results.append("mum put a orange\n");
        V(full_orange);
    }
}


void *Son(void *p) {
    while (num < 5) {
        P(full_orange);
        num++;
        results.append("son eat a orange\n");
        V(empty);
    }
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_mybysj_ui_dashboard_DashboardFragment_getSemResult(JNIEnv *env, jclass clazz) {

    sem_init(full_apple, 0, 0);
    sem_init(full_orange, 0, 0);
    sem_init(empty, 0, 1);

    pthread_t tid0;
    pthread_t tid1;
    pthread_t tid2;
    pthread_t tid3;
    pthread_create(&tid0, NULL, Dad, NULL);
    pthread_create(&tid1, NULL, Mum, NULL);
    pthread_create(&tid2, NULL, Son, NULL);
    pthread_create(&tid3, NULL, Dangter, NULL);
    pthread_join(tid0, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);


    char strBuf[10000] = {' '};
    sprintf(strBuf, "%s", results.c_str());
    return env->NewStringUTF(strBuf);
}

Аналогичным образом система предложит мне сказать, что есть фатальный сигнал

...