线程同步pthread_cond_wait

代码示例展示了一个多线程程序,其中包含调试宏用于不同级别的信息输出。两个线程`test_thread_run`和`test_thread_run_2`在互斥锁和条件变量控制下运行。主线程等待用户输入,根据输入值发送信号给条件变量。当接收到SIGINT信号时,程序会捕获并退出。
摘要由CSDN通过智能技术生成

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>

#define TEST_MOUDLE    "MXSDEBUG"

#define TEST_DEBUG

#ifdef TEST_DEBUG

#define COLOR_RED       "\033[01;40;31m"
#define COLOR_BRED      "\033[01;44;31m"
#define COLOR_GREEN     "\033[01;40;32m"
#define COLOR_YELLOW    "\033[01;40;33m"
#define COLOR_BLUE      "\033[01;40;34m"
#define COLOR_PURPLE    "\033[01;40;35m"
#define COLOR_DEFAULT   "\033[0m"
    
#define DEBUG(lvl, mdl,format, args...) printf(COLOR_BRED"[%s %s]"COLOR_YELLOW"[%s][%s]"COLOR_RED"File: %s, "COLOR_PURPLE"Line: %d, "COLOR_BLUE"Fun: %s, "COLOR_GREEN""format""COLOR_DEFAULT,\
__DATE__, __TIME__, mdl, lvl, __FILE__, __LINE__, __FUNCTION__, ##args);


#define DBG_INFO(mdl, format, args...) DEBUG("INFO", mdl, format, ##args)
#define DBG_ERR(mdl,format, args...)   DEBUG("ERR", mdl, format, ##args)
#define DBG_WARN(mdl,format, args...)  DEBUG("WARN", mdl, format, ##args)
#else
#define DBG_INFO(mdl,format, args...)
#define DBG_ERR(mdl,format, args...)
#define DBG_WARN(mdl,format, args...)
#endif

pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;

void test_thread_run(void)
{
    int cnt = 0;
    
    DBG_INFO(TEST_MOUDLE, "thread test up 1\r\n");
    
    while(1)
    {
        pthread_mutex_lock(&g_mutex);
        pthread_cond_wait(&g_cond, &g_mutex);
        pthread_mutex_unlock(&g_mutex);
        DBG_INFO(TEST_MOUDLE, "1: already RUN.............1\r\n");
    }
}

void test_thread_run_2(void)
{
    int cnt = 0;
    
    DBG_INFO(TEST_MOUDLE, "thread test up 2\r\n");
    
    while(1)
    {
        pthread_mutex_lock(&g_mutex);
        pthread_cond_wait(&g_cond, &g_mutex);
        pthread_mutex_unlock(&g_mutex);
        DBG_INFO(TEST_MOUDLE, "2: already RUN.............2\r\n");
    }
}

void signal_CTRL_C(int signum) {
    DBG_INFO(TEST_MOUDLE, "\033[0mcatch signal %d\n", signum);
    exit(1);
}

void main(int argc, char *argv[])
{
    int getint = 0;
    int ret = 0;
    pthread_t tid;
    pthread_attr_t attr; 
    
    pthread_attr_init( &attr ); 
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    
    pthread_t tid_2;

    signal(SIGINT, signal_CTRL_C);
    
    ret = pthread_create(&tid, &attr, (void*)test_thread_run, NULL);
    
    ret = pthread_create(&tid_2, &attr, (void*)test_thread_run_2, NULL);
    
    while(1)
    {
        DBG_INFO(TEST_MOUDLE, "pls input value:\r\n\r\n");
        scanf("%d", &getint);
        DBG_INFO(TEST_MOUDLE, "getint: %d\r\n", getint);
        DBG_INFO(TEST_MOUDLE, "press any key to continue!\r\n");
        if (getint == 999) {
            pthread_cond_signal(&g_cond);
        } else if (888 == getint)      {
            pthread_cond_broadcast(&g_cond);
        } else {;}
    }
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值