/*
* Description: threrad
* Author: ufo
* Date: 2019-11-06
*/
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#include <unistd.h>
#include "thread_main.h"
char g_buf[100] = {0};
sem_t g_sem;
int g_flag = 0;
int g_work = 0;
int g_task = 0;
int g_isInit = 0;
void *ThreadProc(void *arg)
{
int ret;
while (g_flag == 0) {
ret = sem_wait(&g_sem);
printf("sem_wait(ret:%d), g_sem = 0x%x\n", ret, g_sem);
memset(g_buf, 0, sizeof(g_buf));
if (ret != 0) {
continue;
}
g_work++;
sleep(5);
printf("___________thread run, g_work: %d\n", g_work);
}
printf(">>>>> 线程退出,pthread_exit\n");
}
void ThreadMainInit()
{
int ret;
pthread_t th;
printf("ThreadMainInit()\n");
ret = sem_init(&g_sem, 0, 0);
printf("sem_init(ret:%d), g_sem = 0x%x\n", ret, g_sem);
ret = pthread_create(&th, NULL, ThreadProc, NULL);
if (ret != 0) {
printf("phread_create error, ret=%d\n", ret);
return;
}
while (scanf("%s", g_buf) != EOF) {
if (strncmp(g_buf, "exit", 4) == 0) {
g_flag = -1;
ret = sem_post(&g_sem);
printf("exit, sem_post(ret:%d)g_sem = 0x%x\n", ret, g_sem);
break;
} else if (strncmp(g_buf, "stop", 4) == 0) {
g_flag = 0;
if (g_isInit == 1) {
printf("it has been init(init:%d), no need init again\n", g_isInit);
} else {
printf("begin stop, g_sem = 0x%x\n", g_sem);
ret = sem_init(&g_sem, 0, 0);
g_isInit = 1;
printf("end stop, sem_init(ret:%d), g_sem = 0x%x\n", ret, g_sem);
}
} else {
g_task++;
ret = sem_post(&g_sem);
g_isInit = 0;
printf("add one task, sem_post(ret:%d), g_task = %d, g_sem = 0x%x\n", ret, g_task, g_sem);
}
}
sem_destroy(&g_sem);
}
运行结果:
app_main init()
ThreadMainInit()
sem_init(ret:0), g_sem = 0x7b20e0
1
add one task, sem_post(ret:0), g_task = 1, g_sem = 0x7b20e0
sem_wait(ret:0), g_sem = 0x7b20e0
2
add one task, sem_post(ret:0), g_task = 2, g_sem = 0x7b20e0
3
add one task, sem_post(ret:0), g_task = 3, g_sem = 0x7b20e0
4
add one task, sem_post(ret:0), g_task = 4, g_sem = 0x7b20e0
5
add one task, sem_post(ret:0), g_task = 5, g_sem = 0x7b20e0
___________thread run, g_work: 1
sem_wait(ret:0), g_sem = 0x7b20e0
___________thread run, g_work: 2
sem_wait(ret:0), g_sem = 0x7b20e0
___________thread run, g_work: 3
sem_wait(ret:0), g_sem = 0x7b20e0
___________thread run, g_work: 4
sem_wait(ret:0), g_sem = 0x7b20e0
___________thread run, g_work: 5
6
add one task, sem_post(ret:0), g_task = 6, g_sem = 0x7b20e0
sem_wait(ret:0), g_sem = 0x7b20e0
7
add one task, sem_post(ret:0), g_task = 7, g_sem = 0x7b20e0
8
add one task, sem_post(ret:0), g_task = 8, g_sem = 0x7b20e0
___________thread run, g_work: 6
sem_wait(ret:0), g_sem = 0x7b20e0
stop
begin stop, g_sem = 0x7b20e0
end stop, sem_init(ret:0), g_sem = 0x7b2b80
stop
it has been init(init:1), no need init again
___________thread run, g_work: 7
stop
it has been init(init:1), no need init again
stop
it has been init(init:1), no need init again
stop
it has been init(init:1), no need init again
9
add one task, sem_post(ret:0), g_task = 9, g_sem = 0x7b2b80
sem_wait(ret:0), g_sem = 0x7b2b80
10
add one task, sem_post(ret:0), g_task = 10, g_sem = 0x7b2b80
___________thread run, g_work: 8
sem_wait(ret:0), g_sem = 0x7b2b80
stop
begin stop, g_sem = 0x7b2b80
end stop, sem_init(ret:0), g_sem = 0x7b2c20
___________thread run, g_work: 9
stop
it has been init(init:1), no need init again
stop
it has been init(init:1), no need init again
stop
it has been init(init:1), no need init again
stop
it has been init(init:1), no need init again
11
add one task, sem_post(ret:0), g_task = 11, g_sem = 0x7b2c20
sem_wait(ret:0), g_sem = 0x7b2c20
12
add one task, sem_post(ret:0), g_task = 12, g_sem = 0x7b2c20
13
add one task, sem_post(ret:0), g_task = 13, g_sem = 0x7b2c20
14
add one task, sem_post(ret:0), g_task = 14, g_sem = 0x7b2c20
15
add one task, sem_post(ret:0), g_task = 15, g_sem = 0x7b2c20
___________thread run, g_work: 10
sem_wait(ret:0), g_sem = 0x7b2c20
stop
begin stop, g_sem = 0x7b2c20
end stop, sem_init(ret:0), g_sem = 0x7b2cc0