gpt4 book ai didi

c - C 中基本互斥体导致程序锁定

转载 作者:行者123 更新时间:2023-11-30 15:43:42 24 4
gpt4 key购买 nike

我有一个简单的 C 程序,它使用互斥体从一个线程的标准输入中收集一个字符,并在另一个线程上将其打印出来。两个线程都正确启动(下面的 printf 表示线程开始运行),但是自从我引入 Mutex 以来,这两个线程都没有运行。有人知道为什么吗? (我在字符数组中收集了两个字符,因为我也在收集返回字符。)

谢谢!

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

struct thread_info { /* Used as argument to thread_start() */
pthread_t thread_id;/* ID returned by pthread_create() */
char passedChar[2];
pthread_mutex_t passedCharMutex;
pthread_cond_t conditionalSignal;
};

static void *thread_1_start(void *arg) {
struct thread_info *myInfo = arg;
printf("Started thread id: %d\n", myInfo->thread_id);
while (1) {
printf("thread1 while ran");
pthread_mutex_lock(&myInfo->passedCharMutex);
int rid = read(0,myInfo->passedChar,2);
pthread_mutex_unlock(&myInfo->passedCharMutex);
}
pthread_exit(0);
}

int main() {
struct thread_info tinfo;
printf("Main thread id: %d\n", tinfo.thread_id);

int s = pthread_create(&tinfo.thread_id,
NULL, // was address of attr, error as this was not initialised.
&thread_1_start,
&tinfo);
pthread_join(tinfo.thread_id,NULL);

while (1) {
printf("thread2 while ran");
pthread_mutex_lock(&tinfo.passedCharMutex);
write(1,tinfo.passedChar,2);
pthread_mutex_unlock(&tinfo.passedCharMutex);
}
}

最佳答案

pthread_mutex_t 和 pthread_cond_t 必须先初始化,然后才能使用它们。

struct thread_info tinfo;
pthread_mutex_init(&tinfo.passedCharMutex, NULL);
pthread_cond_init(&tinfo.conditionalSignal, NULL);

在这种情况下,您也可以在初始化 tinfo 变量时初始化它们:

struct thread_info tinfo = {
.passedCharMutex = PTHREAD_MUTEX_INITIALIZER,
.conditionalSignal = PTHREAD_COND_INITIALIZER
};

你还有一个

 pthread_join(tinfo.thread_id,NULL);

创建第一个线程后,这将导致您等待线程结束,但由于 thread_1_start() 运行无限循环,因此永远不会结束 - 您永远不会到达 main() 中的 while 循环。

虽然不是您的问题的一部分,但还有其他问题:

两个线程的逻辑没有同步。就目前而言,它们都在不考虑彼此的情况下运行,因此在 thread_1_start() 读取任何内容之前,您的 main() 可能会多次打印 passedChar

同样,在 main() 线程有机会打印数据之前,thread_1_start() 可能会读取大量数据。

您可能想要的是:

  • 线程 A:读取 2 个字符
  • 线程 A:通知线程 B 有 2 个字符需要处理
  • 线程 A:WAITING线程 B 处理完 2 个字符。

  • 线程 B:WAITING线程 A 发出信号表示有 2 个字符要处理

  • 线程B:处理2个字符
  • 线程 B:通知线程 A 我们已完成处理

关于c - C 中基本互斥体导致程序锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com