0

我正在尝试使用互斥锁使线程等待来自父线程的用户输入。我目前面临的问题是孩子不会等待,即使我有一个互斥锁可以锁定和解锁,然后我也将它加入到父线程中。另外,我目前不确定我的结构是否被正确使用?main() 和 *chthread() 是否使用相同的“锁”实例?我知道,当我在创建线程之前获得用户输入时,它可以工作,但是本练习的要求表明它旨在在创建线程之后传递信息。

#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>

# define BUFFER_SIZE 256

void *chthread(void *arg);

struct  {
pthread_t pth;
pthread_mutex_t lock;
int ret;
void* ex;
} muinfo;

int main(int argc, char *argv[])
{
//struct mutex args;

char line[BUFFER_SIZE];
char *temp = NULL;  

pthread_mutex_init(&muinfo.lock, NULL);
if((pthread_create(&muinfo.pth, NULL, chthread, line)) != 0) {
        perror("Problem creating thread");
}

using_history();
temp = readline("enter a string:  ");
strcpy(line, temp);

if((pthread_join(muinfo.pth, &muinfo.ex)) !=0) {
        perror("Thread join error");
}
free(temp);

pthread_mutex_destroy(&muinfo.lock);   

pthread_exit(NULL); 
}

void *chthread(void *arg)
{
//struct mutex args;
pthread_mutex_lock(&muinfo.lock);
char *line = (char*)arg;


printf("testing %s\n", line);

pthread_mutex_unlock(&muinfo.lock);

pthread_exit(&muinfo.ret);    
//return NULL;
}
4

1 回答 1

0

至于您的主要问题,您需要先在 main 锁定互斥锁(可能在初始化之后),
并在获得用户输入后解锁它,
因此子线程将等到 main 解锁。

pthread_mutex_init(&muinfo.lock, NULL);
pthread_mutex_lock(&muinfo.lock);
if((pthread_create(&muinfo.pth, NULL, chthread, line)) != 0) {
        perror("Problem creating thread");
}

using_history();
temp = readline("enter a string:  ");
strcpy(line, temp);
pthread_mutex_unlock(&muinfo.lock);

我删除了 using_history() 并使用延迟的 strcpy 固定字符串而不是 readline 作为测试,
它对我来说很好。

于 2013-04-18T01:24:47.567 回答