我将继续昨天的帮助,并在子线程中添加了另一个代码。基本上,当用户输入stdin时,子线程应该读取它并将其返回给父线程。但是,在打印输出后,应该将代码重定向回子线程,并等待用户按enter键,一旦用户按enter,就应该退出代码。这是可行的,但我已经使用了sleep(),并且我只想使用mutex(),当我注释sleep(()时,下面的代码首先打印("按enter"),然后父代码打印实际输入。
/*Required header files are added*/
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
/*this structure will hold the string of user input and the lock variable has created*/
struct thread_main
{
char *buffer;
char *bufferparent;
pthread_mutex_t lock;
pthread_mutex_t lock1;
} td;
/*it is a child thread, and store the user value in a buffer variable which has been declared in the thread_main structure*/
static void *thread(void *buff)
{
/*the pointer has assigned to the structure, so we can get the values of a buffer array*/
struct thread_arguments *arg = buff;
//the previous code
pthread_mutex_unlock(&td.lock);
pthread_mutex_destroy(&td.lock);
sleep(1); // I want to ignore this.
pthread_mutex_init(&td.lock, 0);
pthread_mutex_lock(&td.lock);
printf("press enter");
/*this code will read buffer and check the enter*/
pthread_mutex_unlock(&td.lock);
pthread_mutex_destroy(&td.lock);
return NULL;
}
sizeof(arg)
返回4个字节的原因是,您要求的是指针的大小,即4个字节。您将需要另一种方法来告诉线程您的数组的长度。
正如我在评论中所指出的:
线程函数中
arg
的大小是指针的大小;显然,您使用的是32位机器或64位机器上的32位构建。您可能需要创建一个具有指针和大小的结构,并将指向该结构的指针传递给线程函数。
此代码工作并说明了我的意思:
#include <stdio.h>
#include <pthread.h>
struct thread_data
{
char *buffer;
pthread_mutex_t lock;
} td;
struct thread_arg
{
char *buffer;
size_t buflen;
};
static void *thread(void *data)
{
struct thread_arg *arg = data;
printf("%zdn", arg->buflen);
td.buffer = fgets(arg->buffer, arg->buflen, stdin);
pthread_mutex_unlock(&td.lock);
return NULL;
}
int main(void)
{
char buffer[128];
struct thread_arg arg = { buffer, sizeof(buffer) };
pthread_t thread_id;
pthread_mutex_init(&td.lock, 0);
pthread_mutex_lock(&td.lock);
printf("Enter Sync Command -- ");
pthread_create(&thread_id, NULL, thread, &arg);
pthread_mutex_lock(&td.lock);
printf("message read by parent- %s", td.buffer);
pthread_join(thread_id, NULL);
pthread_mutex_unlock(&td.lock);
pthread_mutex_destroy(&td.lock);
return 0;
}
请注意,不能将锁的副本用作与原始锁相同的副本。代码没有检查fgets()
是否真的返回了一行数据(一个错误)。
我根本不相信锁是必要的。我不相信struct thread_data
值得保留。此代码也可以工作,依赖于在父级尝试读取缓冲区之前退出的线程。
#include <stdio.h>
#include <pthread.h>
struct thread_arg
{
char *buffer;
size_t buflen;
};
static void *thread(void *data)
{
struct thread_arg *arg = data;
printf("%zdn", arg->buflen);
fgets(arg->buffer, arg->buflen, stdin);
return NULL;
}
int main(void)
{
char buffer[128];
struct thread_arg arg = { buffer, sizeof(buffer) };
pthread_t thread_id;
printf("Enter Sync Command -- ");
pthread_create(&thread_id, NULL, thread, &arg);
pthread_join(thread_id, NULL);
printf("message read by parent- %s", buffer);
return 0;
}
如果代码和同步变得更加复杂,那么锁定是个好主意。您可能希望将其添加到结构中(或者,等效地,将缓冲区大小添加到结构)。