光看不行还是得写写,在网上找的多线程题目,面试题什么的。注释都在代码中。
/*
* =====================================================================================
*
* 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;
}