自己睡不着敲着玩的,第一个程序是主线程传递一个结构体地址给子线程,第二个传递字符串,第三个是子线程通过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; }