操作系统 实验28 父子进程线程异步性

1、创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为

源程序:

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

int main()

{

    pid_t pid;

    char*msg;

    int k;

    printf("观察父子进程执行的先后顺序,了解调度算法的特征\n");

    pid=fork();

    switch(pid)

    {

        case 0:

            msg="子进程在运行";

            k=3;

            break;

        case -1:

            msg="进程创建失败";

            break;

        default:

            msg="父进程在运行";

            k=5;

            break;

    }

    while(k>0)

    {

        puts(msg);

        sleep(1);

        k--;

     }

     exit(0);

}

编译链接命令:gcc parent-child-fork.c -o parent-child-fork

运行命令:./parent-child-fork

交互与结果:

2、创建主线程和子线程,观察多线程执行的顺序,了解线程执行的异步行为

源程序:

#include <stdio.h>
#include <pthread.h>
static int run=1;
static int retvalue;
void *threadfunc(void*arg)
{
	int*running=arg;
	
	printf("子线程初始化完毕,传入参数为:%d\n",*running);	
	while(*running)	
	{
		printf("子线程正在运行\n");
		usleep(1);
	}
	printf("子线程退出\n");
	retvalue=8;
	pthread_exit((void*)&retvalue);
}
int main()
{
	pthread_t pt;
	int ret=-1;
	int times=3;
	int i=0;
	int *ret_join=NULL;
	ret=pthread_create(&pt,NULL,(void*)threadfunc,&run);	
	if(ret!=0)
	{
		printf("建立线程失败\n");
		return 1;
	}
	printf("主线程创建子线程后在运行...\n");
	usleep(1);	
	printf("主线程调用usleep(1)...\n");
	for(;i<times;i++)
	{
		printf("主线程打印i=%d\n",i);
		usleep(1);
	}
	run=0;
	pthread_join(pt,(void*)&ret_join);	
	printf("线程返回值为:%d\n",*ret_join);
	return 0;
}

编译链接命令:gcc thread.c -o thread -lpthread

运行命令:./thread

交互与结果:

3、多线程对共享变量的非互斥访问

源程序:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
int num=30,count=10;
void *sub1(void *arg) {
int i = 0,tmp;
for (; i <count; i++)
    {
    		tmp=num-1;
	 	usleep(13);
        	num=tmp;
        printf("线程1 num减1后值为: %d\n",num);
    }
    return ((void *)0);
}
void *sub2(void *arg){
int i=0,tmp;
    for(;i<count;i++)
    {
    		tmp=num-1;
	 	usleep(31);
		num=tmp;
        printf("线程2 num减1后值为: %d\n",num);
    }
    return ((void *)0);
}
int main(int argc, char** argv) {
pthread_t tid1,tid2;
    int err,i=0,tmp;
    void *tret;
    err=pthread_create(&tid1,NULL,sub1,NULL);
    if(err!=0)
    {
    	printf("pthread_create error:%s\n",strerror(err));
        exit(-1);
    }
err=pthread_create(&tid2,NULL,sub2,NULL);
    if(err!=0)
    {
    	printf("pthread_create error:%s\n",strerror(err));
          exit(-1);
    }
    for(;i<count;i++)
    {
    		tmp=num-1;
	 	usleep(5);	
        	num=tmp;
        printf("main num减1后值为: %d\n",num);
    }
    printf("两个线程运行结束\n");
	err=pthread_join(tid1,&tret);
    if(err!=0)
    {
    	printf("can not join with thread1:%s\n",strerror(err));
        exit(-1);
    }
    printf("thread 1 exit code %d\n",(int)tret);
    err=pthread_join(tid2,&tret);
    if(err!=0)
    {
    	printf("can not join with thread1:%s\n",strerror(err));
        exit(-1);
    }
    printf("thread 2 exit code %d\n",(int)tret);
return 0;
}

编译链接命令:gcc thrsharenomutex.c -o thrsharenomutex -lpthread

运行命令:./thrsharenomutex

交互与结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值