开发者社区> 问答> 正文

linux多线程问题

/*
 * 编写程序完成如下功能:
 * (1)有一int型全局变量g_Flag初始值为0
 * (2)在主线程中创建线程1,打印“this is thread1”,并将g_Flag设置为1
 * (3)在主线程中创建线程2,打印“this is thread2”,并将g_Flag设置为2
 * (4)线程1需要在线程2退出后才能退出
 * (5)主线程在检测到g_Flag从1变为2,或者2变为1的时候退出
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

int g_Flag = 0;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

// 线程1在线程2退出后退出
void print_change1(void *arg) {
    printf("this is thread1\n");
    
    // 进入临界区,设置g_Flag
    pthread_mutex_lock(&mutex);
    if(g_Flag == 2) {
        pthread_cond_signal(&cond);
    }
    g_Flag = 1;
    pthread_mutex_unlock(&mutex);

    // 等待线程2结束
    pthread_join(*(pthread_t *)arg, NULL);
    printf("线程1等到线程2结束了!\n");

    //printf("thread1 exit\n");
    pthread_exit(0);
}

void print_change2(void *arg) {
    printf("this is thread2\n");

    // 进入临界区,设置g_Flag
    pthread_mutex_lock(&mutex);
    if(g_Flag == 1) {
        pthread_cond_signal(&cond);
    }
    g_Flag = 2;
    pthread_mutex_unlock(&mutex);

    printf("thread2 exit\n");
    pthread_exit(0);
}

int main() {
    int ret;
    pthread_t t1, t2;

    // 创建线程
    ret = pthread_create(&t2, NULL, (void *)print_change2, NULL);
    ret = pthread_create(&t1, NULL, (void *)print_change1, &t2);

    // 等待条件变量,然后退出
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
    printf("main exit\n");
    exit(0);
}

screenshot
为什么“线程1等到线程2结束了!”会打印两次?求解!

展开
收起
a123456678 2016-06-23 14:57:37 1868 0
1 条回答
写回答
取消 提交回答
  • 我测试了不会啊。不过你的代码有点问题,main都退出了,还有创建的子线程还没退出。应该等所有子线程退出main再退出。否则各个平台情况可能都不同,看具体实现。

    2019-07-17 19:46:20
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载