Я хочу использовать пример семафора операции 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);
}
Аналогичным образом система предложит мне сказать, что есть фатальный сигнал