多条件变量应用--传送与搬运问题

1.描述

一个货运装置,传送带会将一件货物传送过来,货物传送过来以后,装货员会将货物装上车
这件货物装车后,传送带会将下一件货物传送过来,然后装货员会再将物装装上车
装上8件物品后,车子装满,传送带会停止传送货物

利用多线程方式实现物品传送和装货的次序

根据给出的代码文件,阅读基本代码文件含义,实现空缺部分的代码
代码目的:通过创建两个线程来实现对一个数的递加,在“TODO”处添加代码

Output:
正在传送第 (1) 个货物
正在装车第 (1) 个货物
正在传送第 (2) 个货物
正在装车第 (2) 个货物
正在传送第 (3) 个货物
正在装车第 (3) 个货物
正在传送第 (4) 个货物
正在装车第 (4) 个货物
正在传送第 (5) 个货物
正在装车第 (5) 个货物
正在传送第 (6) 个货物
正在装车第 (6) 个货物
正在传送第 (7) 个货物
正在装车第 (7) 个货物
正在传送第 (8) 个货物
正在装车第 (8) 个货物
本次装车结束
本次装车结束

2.代码

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

#define COUNT 8   //车子装满货物的数量

static int int_conveying_number = 0;   // 已经传送了多少货物
static int int_loading_number = 0;     // 已经装车了多少货物

pthread_mutex_t lock;
pthread_cond_t can_conveying;  // 货物传送。
pthread_cond_t can_loading;    // 货物装车

void *loading(void *data)
{
    /* TODO: write code as below */
    /* TODO: 货物装车,装车完成后通知传送货物 */
    while (int_loading_number < COUNT) {
        pthread_mutex_lock(&lock);
        while (int_loading_number >= int_conveying_number) {
            pthread_cond_wait(&can_conveying, &lock);
        }
        printf("正在装车第 (%d) 个货物\n", ++int_loading_number);
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&can_loading);
        
    }
    printf("本次装车结束\n");
    return NULL;
}


void *conveying(void *data)
{
    /* TODO: write code as below */
    /* TODO: 传送货物,货物传送过来后通知装车 */
    while (int_conveying_number < COUNT) {
        pthread_mutex_lock(&lock);
        while (int_conveying_number > int_loading_number) {
            pthread_cond_wait(&can_loading, &lock);
        }
        printf("正在传送第 (%d) 个货物\n", ++int_conveying_number);
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&can_conveying);
    }
    printf("本次传送结束\n");
    return NULL;
}

int main(void)
{
    pthread_t th_conveyor, th_worker;
    void *retval;
    pthread_mutex_init(&lock, NULL);
    pthread_cond_init(&can_conveying, NULL);
    pthread_cond_init(&can_loading, NULL);

    pthread_create(&th_conveyor, NULL, conveying, NULL);
    pthread_create(&th_worker, NULL,loading, NULL);

    /* 等待装车完成,结束*/
    pthread_join(th_conveyor, &retval);
    pthread_join(th_worker, &retval);
    pthread_mutex_destroy(&lock);
    pthread_cond_destroy(&can_conveying);
    pthread_cond_destroy(&can_loading);

    return 0;
}

3.编译

Makefile:


DBG        = #-ggdb3
OPTFLAGS   = -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes $(DBG) -pedantic

SRC        = convery_and_load.c
TARGET     = convery_and_load
OBJ        = $(SRC:.c=.o)

default: $(TARGET)
LDFLAGS += -lpthread
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

$(TARGET): $(OBJ)
	$(CC) -o $@ $(OBJ) $(LDFLAGS) 

clean:
	rm $(TARGET)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值