我正在尝试使用互斥锁使线程等待来自父线程的用户输入。我面临的当前问题是孩子不等待,即使我有一个锁定和解锁的互斥锁,然后我也加入了父线程。另外,我目前不确定我的结构是否正确使用? main()和* chthread()是否使用相同的“lock”实例?我理解当我在创建它的线程之前获得用户输入时,但是这个练习的要求表明它是在创建线程之后传递信息。
#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;
}
答案 0 :(得分:0)
至于你的主要问题,你需要首先锁定互斥锁(可能在初始化之后),
在收到用户输入后解锁,
所以子线程将等到主解锁。
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作为test,
它对我来说很好。