父子进程之间的参数传递和数据返回 pthread_create & pthread_join

自己睡不着敲着玩的,第一个程序是主线程传递一个结构体地址给子线程,第二个传递字符串,第三个是子线程通过pthread_exit()传递数据,然后pthread_join阻塞那里捕获。

 int pthread_create(pthread_t *restrict thread,
                  const pthread_attr_t *restrict attr,
                  void *(*start_routine)(void*), 
   void *restrict arg);


下面说明一下各个参数的含义:
thread :所创建的线程号。
attr :所创建的线程属性,这个将在后面详细说明。
start_routine :即将运行的线程函数。
art :传递给线程函数的参数。


防止main线程提前退出,pthread_join 函数会让主线程阻塞,直到所有线程都已经退出。


int pthread_join(pthread_t thread, void **value_ptr);
thread :等待退出线程的线程号。
value_ptr :退出线程的返回值。


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

struct mypack
{
	int a;
	char b[50];
};

struct mypack *test;

void *thr_fun(void *arg)
{
	(struct mypack *)arg;
	printf("a:%d\nb:%s",test->a,test->b);
}

int main(int argc, char *argv[])
{
	int err;
	test = (struct mypack *)malloc(sizeof(struct mypack));
	pthread_t tid;
	test->a = 1234;
//		sprintf(test->b,"%s",str);
	char *str = "ssssssssss";
//	memcpy(test->b,str,strlen(str));
	sprintf(test->b,"%s",str);
	err = pthread_create(&tid,NULL,thr_fun,(void *)test);
	if(err != 0)
	  printf("create thread error\n");

	sleep(3);
	return 0;
}


这个程序还有问题,明天处理

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

struct mypack
{
	int a;
	char b[50];
};

struct mypack *test;

void *thr_fun(void *arg)
{
	test = (struct mypack *)malloc(sizeof(struct mypack));
	test = arg;
	test->a =1234;
	char *ss = "sssssssssss";
	sprintf(test->b,"%s",ss);
	pthread_exit((void *)test);//出错位置________________________________________________
}

int main(int argc, char *argv[])
{
	int err;
	test = (struct mypack *)malloc(sizeof(struct mypack));
	pthread_t tid;
	
	err = pthread_create(&tid,NULL,thr_fun,NULL);
	if(err != 0)
	  printf("create thread error\n");
	
	void **ss;
	pthread_join(tid,ss);
	(struct mypack **)ss;
	printf("a:%d\nb:%s\n",(*ss)->a,(*ss)->b);
	sleep(3);
	return 0;
}


我曾经也把后面几行代码改成, 

struct mypack *ss

(void *)ss;

pthread_join(tid,&ss);

仍然出错,问了带我的人,一句话解决了。 

出错原因,主要是struct mypack * ss;以后,不能使用(void *)把其强制转换成void *类型。

反复出现,要不传入的类型有错误,要不类型正确,但是那个指针指向的something中没有数据结构里所具有的类型。



修改正确以后:

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

struct mypack
{
	int a;
	char ss[50];
};

struct mypack *test;
void *thr_fun(void *arg)
{
	test = (struct mypack *)malloc(sizeof(struct mypack));
	test->a = 1234;
	char *str ="dddddddddd";
	sprintf(test->ss,"%s",str);
	void *swap;
	swap = test;
	pthread_exit(swap);
}
int main(int argc,char *argv[])
{
	int err;
	pthread_t tid;
	err = pthread_create(&tid,NULL,thr_fun,NULL);
	if(err != 0)
		printf("create thread error\n");

	struct mypack *target;
	void *ss;
	pthread_join(tid,&ss);
	target = ss;
	printf("a:%d\nb:%s\n",target->a,target->ss);
	return 0;
}


你可能感兴趣的:(JOIN,thread,数据结构,struct,null,fun)