您的位置:首页 > 其它

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

2011-10-27 02:43 260 查看
自己睡不着敲着玩的,第一个程序是主线程传递一个结构体地址给子线程,第二个传递字符串,第三个是子线程通过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: