周一IO作业

1.有三个线程,ID号分别为ABC,且每个线程中都在循环打印自己的ID。要求打印的结果为ABC
#include 
#include 
#include 

#define NUM_THREADS 3

// 定义互斥锁和条件变量
pthread_mutex_t mutex;
pthread_cond_t condition;

// 全局变量,用于表示当前应该打印的线程索引
int currentThreadIndex = 0;

// 线程函数
void* printThread(void* arg) {
    // 获取线程ID
    int threadIndex = *(int*)arg;
    char id = 'A' + threadIndex;

    for (int i = 0; i < 10; i++) {
        pthread_mutex_lock(&mutex);

        // 如果当前线程索引不等于自己的索引,就等待
        while (currentThreadIndex != threadIndex) {
            pthread_cond_wait(&condition, &mutex);
        }

        // 打印自己的ID
        printf("%c", id);

        // 更新当前线程索引并通知下一个线程
        currentThreadIndex = (currentThreadIndex + 1) % NUM_THREADS;
        pthread_cond_signal(&condition);

        pthread_mutex_unlock(&mutex);
    }

    pthread_exit(NULL);
}

int main() {
    pthread_t threads[NUM_THREADS];
    int threadArgs[NUM_THREADS];

    // 初始化互斥锁和条件变量
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&condition, NULL);

    // 创建线程
    for (int i = 0; i < NUM_THREADS; i++) {
        threadArgs[i] = i;
        pthread_create(&threads[i], NULL, printThread, &threadArgs[i]);
    }

    // 等待线程结束
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

    // 销毁互斥锁和条件变量
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&condition);

    printf("\n");  // 换行

    return 0;
}
2.实现AB进程对话, a.A进程发送一句话之后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印 b.重复上述步骤,直到AB接受或者发送完quit后,结束AB进程。
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFFER_SIZE 1024

int main() {
    int fd[2];
    pid_t pid;

    // 创建管道
    if (pipe(fd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (pid == 0) {  // 子进程(B进程)
        close(fd[1]);  // 关闭管道写端

        char buffer[BUFFER_SIZE];
        int count;

        while ((count = read(fd[0], buffer, BUFFER_SIZE)) > 0) {
            buffer[count] = '\0';
            printf("B: %s\n", buffer);

            if (strcmp(buffer, "quit\n") == 0) {  // 如果接收到 quit,则结束循环
                break;
            }

            printf("B");
            fgets(buffer, BUFFER_SIZE, stdin);

            write(fd[1], buffer, strlen(buffer));
        }

        close(fd[0]);  // 关闭管道读端
        exit(EXIT_SUCCESS);
    } else {  // 父进程(A进程)
        close(fd[0]);  // 关闭管道读端

        char buffer[BUFFER_SIZE];

        printf("A");
        while (fgets(buffer, BUFFER_SIZE, stdin)) {
            write(fd[1], buffer, strlen(buffer));

            if (strcmp(buffer, "quit\n") == 0) {  // 如果发送 quit,则结束循环
                break;
            }

            int status;
            wait(&status);  // 等待子进程的回应

            printf("A");
        }

        close(fd[1]);  // 关闭管道写端
        exit(EXIT_SUCCESS);
    }

    return 0;
}

你可能感兴趣的:(c++,算法,开发语言)