#include<stdio.h> #include<pthread.h> #include<unistd.h> int tickets = 15; pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; void * sell_tickets1(void *arg){ while (1) { pthread_mutex_lock(&mutex1); if(tickets > 0) { printf("W1: %d tickets are left\n",tickets--); } else { pthread_mutex_unlock(&mutex1); break; } pthread_mutex_unlock(&mutex1); sleep(1); } printf("W1: 10 tickets were sold from window 1\n"); return NULL; } void * sell_tickets2(void *arg){ while (1) { pthread_mutex_lock(&mutex1); if(tickets > 0) { printf("W2: %d tickets are left\n",tickets--); } else { pthread_mutex_unlock(&mutex1); break; } pthread_mutex_unlock(&mutex1); sleep(2); } printf("W2: 5 tickets were sold from window 2\n"); return NULL; } int main() { pthread_t t1,t2; pthread_create(&t1, NULL, sell_tickets1, NULL); pthread_create(&t2, NULL, sell_tickets2, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); return 0; }
时间: 2024-01-15 19:03:14 浏览: 62
这段代码是一个经典的多线程编程例子,用于模拟两个售票窗口售卖15张票的过程。主要涉及到线程的创建、互斥锁的使用等。
在该程序中,tickets变量表示剩余票数,sell_tickets1和sell_tickets2是两个线程函数,分别表示两个售票窗口的售票过程。互斥锁mutex1用于保证线程间对tickets变量的访问不会出现竞争条件。具体实现中,每个线程在访问tickets变量之前都会先对mutex1进行加锁,然后进行售票操作,最后再释放锁。当剩余票数为0时,线程退出循环,释放锁。
该程序中使用了pthread库中的相关函数,如pthread_mutex_lock、pthread_mutex_unlock、pthread_create、pthread_join等。
需要注意的是,该程序在两个线程中分别使用了不同的睡眠时间,即sell_tickets1中睡眠1秒,sell_tickets2中睡眠2秒。这是为了模拟不同售票窗口的售票速度不同,同时也能更好地展示多线程编程带来的效果。
相关问题
#include <stdio.h>中小写转大写
`#include <stdio.h>` 是 C 语言中预处理指令的一部分,它引入了标准输入输出库(stdio),而小写转大写通常是在字符串操作中需要的。在 C 语言中,如果你想要将字符串中的所有字符从小写转换为大写,可以先定义一个函数,比如使用标准库提供的 `toupper()` 函数,它是 `ctype.h` 库的一部分,用于转换字符。
下面是一个简单的示例,展示如何在 C 中实现这个功能:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 自定义函数,接收字符串并返回转换后的字符串
char* to_uppercase(char *str) {
int len = strlen(str);
for (int i = 0; i < len; ++i) {
str[i] = toupper((unsigned char)str[i]);
}
return str;
}
int main() {
char lowercase_str[] = "hello, world!";
char uppercase_str[50];
strcpy(uppercase_str, to_uppercase(lowercase_str));
printf("Original: %s\n", lowercase_str);
printf("Uppercased: %s\n", uppercase_str);
return 0;
}
```
在这个例子中,`to_uppercase` 函数遍历字符串中的每个字符,并调用 `toupper` 将其转换成大写。然后在主函数中,我们将小写字符串传递给这个函数,得到的结果存储在另一个数组中。
#include "crc.h"#include <stdio.h>
这段代码包含了两个头文件:`crc.h` 和 `<stdio.h>`。`crc.h` 通常用于计算循环冗余校验(CRC)值,而 `<stdio.h>` 提供了标准输入/输出功能,如文件操作和基本的 I/O 流控制。
`#include "crc.h"` 引入了一个名为 `crc.h` 的库,可能包含了一些函数来计算 CRC 值,例如计算文件、数据块或字符串的校验和。
`#include <stdio.h>` 包含了标准输入输出函数,例如 `printf()` 和 `scanf()`,用于处理文本输入输出。
下面是一个简单的使用这两个头文件的示例,假设`crc.h`中有`crc32()`函数来计算CRC32校验值:
```c
#include "crc.h"
#include <stdio.h>
int main() {
char data[] = "Hello, World!";
uint32_t crc = crc32(0, data, strlen(data)); // 初始化为0,计算data的CRC值
printf("CRC-32 of the string: %u\n", crc); // 输出CRC值
return 0;
}
```
在这个例子中,我们计算了字符串 "Hello, World!" 的CRC-32值并打印出来。
阅读全文