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)