Hello World
- 安装gcc用来编译c代码
bash
sudo yum install gcc
- 编写
Hello World
c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
- 使用
gcc
编译
-o 是指定出处文件的名字------也就是编译完的文件会叫hello
bash
gcc hello.c -o hello
- 运行
./hello
运行
开篇
虚拟化CPU
- 编写一段代码,效果为反复打印用户启动程序时传入的字符串
vim cpu.c
c
#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
void spin(int seconds){
usleep(seconds *1000000);
}
int main(int argc,char *argv[]) {
if(argc!=2){
fprintf(stderr,"usage:cpu<string>\n");
exit(1);
}
char* str=argv[1];
while(1){
spin(1);
printf("%s\n",str);
}
return 0;
}
- 编译
gcc -o cpu cpu.c
- 启动一个
./cpu A
- 同时启动多个
./cpu A & ./cpu B & ./cpu C & ./cpu D
- 终止运行
killall cpu
虚拟化内存
并发
c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> // 确保包含pthread库的头文件
volatile int counter = 0; // 共享计数器,使用volatile以防止编译器优化
int loops; // 每个线程要执行的循环次数
// 工作线程的函数
void *worker(void *arg) {
int i;
for (i = 0; i < loops; i++) {
counter++; // 增加共享计数器
}
return NULL;
}
int main(int argc, char *argv[]) {
if (argc != 2) { // 检查命令行参数
fprintf(stderr, "usage: threads <value>\n");
exit(1);
}
loops = atoi(argv[1]); // 从命令行参数获取循环次数
pthread_t p1, p2; // 创建两个线程标识符
printf("Initial value : %d\n", counter); // 打印初始计数器值
// 创建两个线程
pthread_create(&p1, NULL, worker, NULL);
pthread_create(&p2, NULL, worker, NULL);
// 等待两个线程完成
pthread_join(p1, NULL);
pthread_join(p2, NULL);
printf("Final value : %d\n", counter); // 打印最终计数器值
return 0;
}
加互斥锁
c
#include <pthread.h>
pthread_mutex_t lock; // 声明一个互斥锁
void *worker(void *arg) {
int i;
for (i = 0; i < loops; i++) {
pthread_mutex_lock(&lock); // 加锁
counter++;
pthread_mutex_unlock(&lock); // 解锁
}
return NULL;
}
int main(int argc, char *argv[]) {
pthread_mutex_init(&lock, NULL); // 初始化互斥锁
...
pthread_mutex_destroy(&lock); // 销毁互斥锁
}