线程&进程(学校作业5)

1.查看源代码

1.1.1线程

Linux系统上所有运行的东西都可以看成进程。一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。

1.1.2进程

进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

1.2

ubuntu需要安装pthread库

sudo apt-get install -y glibc-doc manpages-posix-dev

查看 pthread手册

sudo apt-get install manpages-posix manpages-posix-dev

2.编译各个程序并在Ubuntu运行

编译命令为:gcc -o ptread pthread.c -lpthread

编译成功之后,我们执行生成的可执行文件

./out

2.1

pthread_create() 函数声明中在<pthread.h>中,语法格式如下:

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine) (void *),
                   void *arg);

pthread_t *thread:传递一个 pthread_t 类型的指针变量,也可以直接传递某个 pthread_t 类型变量的地址。pthread_t 是一种用于表示线程的数据类型,每一个 pthread_t 类型的变量都可以表示一个线程。

2.2

想获取某个线程执行结束时返回的数据,可以调用 pthread_join() 函数来实现。

pthread_join()函数声明 在<pthread.h>头文件中,语法格式如下

int pthread_join(pthread_t thread, void ** retval);

thread 参数用于指定接收哪个线程的返回值;retval 参数表示接收到的返回值,如果 thread 线程没有返回值,又或者我们不需要接收 thread 线程的返回值,可以将 retval 参数置为 NULL。

 编译并运行

gcc -o Untitled-2.out Untitled-2.c -lpthread -lm

./Untitled-2.out

  

2.3

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
//全局变量,模拟总的票数
int ticket_sum = 10;
//模拟4个售票员一起售卖票的过程
void *sell_ticket(void *arg){
    int i;
    //4个售票员负责将 10 张票全部卖出
    for (i = 0; i < 10; i++)
    {
        //直至所有票全部卖出,4 个售票员才算完成任务
        if (ticket_sum > 0)
        {
            sleep(1);
            //每个线程代表一个售票员
            printf("%u 卖第 %d 张票\n", pthread_self(), 10 - ticket_sum + 1);
            ticket_sum--;
        }
    }
    return 0;
}
int main(){
    int flag;
    int i;
    void *ans;
    //创建 4 个线程,代表 4 个售票员
    pthread_t tids[4];
    for (i = 0; i < 4; i++)
    {
        flag = pthread_create(&tids[i], NULL, &sell_ticket, NULL);
        if (flag != 0) {
            printf("线程创建失败!");
            return 0;
        }
    }
    sleep(10); // 阻塞主线程,等待所有子线程执行结束
    for (i = 0; i < 4; i++)
    {
        flag = pthread_join(tids[i], &ans);
        if (flag != 0) {
            printf("tid=%d 等待失败!", tids[i]);
            return 0;
        }
    }
    return 0;
}
 

  

  

 线程之间的竞争可能导致每次输出不一样。 

2.4信号函数sigaction的使用

信号(signal),又称为软中断信号,用来通知进程发生了异步事件。进程之 间可以互相发送信号,内核也可以因为内部事件而给进程发送信号。注意,信号 的作用仅仅是通知进程发生了什么事件,并不向该进程传递任何数据。

 

3.运行开发板

3.1 下载、安装、运行QEMU

下载成功后,进入ubuntu-18.04_imx6ul_qemu_system目录,执行install_sdl.sh

必须在Ubunut的桌面环境下启动终端,执行./qemu-imx6ull-gui.sh

我们可以看到下面界面

3.2 打开LCD图像和屏幕

$ fb-test

$ cd myfb-test

3.3 串口EEPROM

$ cd

$ i2cdetect -l #列出所有ic2总线

$ i2cdetect -y 0 #列出总线0上的设备

3.4命令控制LED

安装LED驱动

$ cd

$ cd led_driver_qemu/

$ insmod 100ask_led.ko

控制LED零号灯亮

$ ./ledtest /dev/100ask_led0 on


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值