sem_init测试

/*
 * 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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值