linux c 多线程编程练习(一)

光看不行还是得写写,在网上找的多线程题目,面试题什么的。注释都在代码中。

/*
 * =====================================================================================
 *
 *       Filename:  loop.c
 *
 *    Description:  子线程循环10次,接着回到主线程循环100次,再回到子线程循环10次,再回到主线程100次,如此50次
 *
 *        Version:  1.0
 *        Created:  2012年09月23日 15时50分10秒
 *       Revision:  
 *       Compiler:  GCC 
 *
 *         Author:  yadon_z , 
 *
 * =====================================================================================
 */


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

pthread_mutex_t loop_lock = PTHREAD_MUTEX_INITIALIZER;  //初始化为普通互斥量
pthread_cond_t loop_cond = PTHREAD_COND_INITIALIZER;    //初始化为普通条件变量
int flag = 99;  //因为主线程在1的时候已经在等待。所以flag变为0的时候主线程还是会执行一次。所以循环50次设置为50*2-1;

/*---------------------------------------------------------

 Function Name : loop()
   Descrypthon : 子线程,循环100次。通过flag来控制执行的先后顺序和是否执行。如果是双数就等待,因为flag初始值为奇数,所以子进程先执行。

------------------------------------------------------------*/
void *loop()
{
    int i;
    while (flag>0) {
        pthread_mutex_lock(&loop_lock);
        if (flag%2 == 0) {              
            pthread_cond_wait(&loop_cond,&loop_lock); 
        }

        for (i = 0; i < 10; i++) {
            printf("child %d \n",i);
        }
        flag--;
        pthread_mutex_unlock(&loop_lock); 
        pthread_cond_broadcast(&loop_cond); 
    }

    return (void *)1;
}


/*---------------------------------------------------------

 Function Name : main()
   Descrypthon : 创建线程之后进入循环,先锁互斥量,如果flag为奇数则等待。如果为偶数则循环打印,之后flag减1,解锁,唤醒。

------------------------------------------------------------*/
int main(int argc, const char *argv[])
{
    pthread_t tid;
    int err;
    int i;
    void *pret;

    err = pthread_create(&tid, NULL, loop, NULL);

    while (flag>0) {
        pthread_mutex_lock(&loop_lock);
        if (flag%2 != 0) {
            pthread_cond_wait(&loop_cond, &loop_lock);
        }

        for (i = 0; i < 100; i++) {
            printf("parent %d \n",i);
        }
        flag--;
        pthread_mutex_unlock(&loop_lock);
        pthread_cond_broadcast(&loop_cond);
    }

    err = pthread_join(tid, &pret);
    if (err) {
        printf("join err %d \n",err);
    }

    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值