Skip to content

请先给出一个linux下使用线程的案例

ChatGPT 说:

ChatGPT

好的!下面是一个在 Linux 环境下使用 POSIX 线程(pthread)的简单示例。这个程序创建了两个线程,每个线程执行一个独立的任务。

示例代码:使用线程

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

void* thread_func1(void* arg) {
    for (int i = 0; i < 5; i++) {
        printf("线程 1 正在运行...\n");
        sleep(1);  // 模拟工作,暂停1秒
    }
    return NULL;
}

void* thread_func2(void* arg) {
    for (int i = 0; i < 5; i++) {
        printf("线程 2 正在运行...\n");
        sleep(2);  // 模拟工作,暂停2秒
    }
    return NULL;
}

int main() {
    pthread_t thread1, thread2;

    // 创建两个线程
    pthread_create(&thread1, NULL, thread_func1, NULL);
    pthread_create(&thread2, NULL, thread_func2, NULL);

    // 等待两个线程完成
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("主线程:所有任务完成。\n");

    return 0;
}

解释:

  1. pthread_create():用于创建线程。第一个参数是指向线程标识符的指针,第二个参数用于设置线程的属性(此处为 NULL 表示使用默认属性),第三个参数是线程的执行函数,第四个参数是传递给执行函数的参数(此例中传递 NULL)。

  2. pthread_join():用于等待线程执行完毕。主线程调用 pthread_join() 会等待指定线程结束执行,确保在主程序退出前所有线程都已经完成。

  3. sleep():用于模拟线程执行任务的延迟。不同的线程有不同的睡眠时间,以展示它们的独立运行。

运行步骤:

  1. 将代码保存为 pthread_example.c

  2. 在终端中编译并运行:

    gcc -o pthread_example pthread_example.c -lpthread ./pthread_example

注意事项:

  1. 线程独立性:每个线程可以独立运行,主线程使用 pthread_join() 等待子线程结束,确保在所有线程结束后程序才会退出。
  2. -lpthread:编译时需要链接 pthread 库,使用 -lpthread 选项。

你可以在此基础上扩展线程的使用,比如传递参数给线程,增加线程数量,或是使用线程同步机制(如信号量、互斥锁)等。

Makefile

makefile
# 定义编译器
CC = gcc
# 定义编译选项
CFLAGS = -Wall -pthread
# 定义目标可执行文件
TARGET = pthread_example
# 定义目标源文件
SRCS = pthread_example.c
# 定义生成的目标文件
OBJS = $(SRCS:.c=.o)
# 默认目标:生成可执行文件
all: $(TARGET)
# 链接目标文件,生成可执行文件
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
# 编译源文件生成目标文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@
# 清理命令:删除目标文件和可执行文件
clean:
	rm -f $(OBJS) $(TARGET)

Makefile解释:

  1. CC = gcc:指定编译器为 gcc
  2. CFLAGS = -Wall -pthread:编译选项:
    • -Wall:启用所有警告,帮助发现潜在问题。
    • -pthread:启用线程支持。
  3. TARGET = pthread_example:生成的可执行文件名称为 pthread_example
  4. SRCS = pthread_example.c:源文件为 pthread_example.c
  5. OBJS = $(SRCS:.c=.o):将源文件的 .c 后缀替换为 .o,生成目标文件列表。
  6. all: $(TARGET):默认目标是生成可执行文件。
  7. $(TARGET): $(OBJS):将目标文件链接生成可执行文件。
  8. %.o: %.c:规则定义如何从源文件生成目标文件。
  9. clean:清理命令,删除编译生成的 .o 文件和可执行文件。

使用方法:

  1. 将代码文件保存为 pthread_example.c

  2. Makefile 保存到同一个目录中。

  3. 在终端中运行以下命令进行编译和执行: make # 编译程序 ./pthread_example # 运行生成的可执行文件

  4. 要清理生成的文件(可执行文件和 .o 文件),运行: make clean

这个 Makefile 会自动处理源文件的编译和可执行文件的生成,方便管理代码和清理文件。