创建线程并通过父级传递输入

时间:2013-04-18 00:48:07

标签: c mutex

我正在尝试使用互斥锁使线程等待来自父线程的用户输入。我面临的当前问题是孩子不等待,即使我有一个锁定和解锁的互斥锁,然后我也加入了父线程。另外,我目前不确定我的结构是否正确使用? 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;
}

1 个答案:

答案 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,
它对我来说很好。