作者skyHuan (Huan)
看板C_and_CPP
标题[问题]
时间Thu Oct 11 13:17:03 2018
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
pthread
问题(Question):
最近在做多执行绪的实作遇到两个问题
1.
因为pthread_create要呼叫的函式需要的参数是用指标宣告
所以函式的参数宣告成(void *)
我用一个args array传入参数
那这个参数在函式中该怎麽取用呢
我写的直接用arg[0], arg[1]应该是错的
compiler会有dereferencing "void *" pointer的warning
2.
另外最後我想要divide成两个部份给两个执行绪去执行
呼叫的pthread_create的第三个&第四个参数
直接给函式名字&新的存参数array这样是对的吗
错误结果(Wrong Output):
dereferencing "void *" pointer的warning
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
int Partition(int p, int r) {
...
return q;
}
void* func(void *arg) {
pthread_attr_t attr;
pthread_t thread_L;
pthread_t thread_R;
pthread_attr_init(&attr);
int p = arg[0];
int r = arg[1];
if (p < r) {
int q = Partition(p, r);
int arg_L[2] = { p, q-1 };
int arg_R[2] = { q+1, r };
//QuickSort(arg_L);
if(pthread_create(&thread_L, NULL, func, arg_L)) {
fprintf(stderr, "error an exit\n");
return NULL;
}
//QuickSort(arg_R);
if(pthread_create(&thread_R, NULL, func, arg_R)) {
fprintf(stderr, "error an exit\n");
return NULL;
}
pthread_join(thread_L, NULL);
pthread_join(thread_R, NULL);
}
}
int main(int argc, char *argv[]) {
...
int args[2] = { p, r };
func(args);
}
补充说明(Supplement):
抱歉对指标的概念不是很好,还请前辈们多多赐教,感谢万分
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.229.214.58
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1539235025.A.C96.html
※ 编辑: skyHuan (36.229.214.58), 10/11/2018 13:17:56
1F:→ descent: 你的 func() 怎麽自己又要 create thread?10/11 17:25
2F:→ descent: 是 Partition 吗?10/11 17:25
其实func()原本是Quicksort
我把跟问题没关系的地方省略了
Partition函式用来找divide的地方的
找到之後create thread分两部分Quicksort
3F:推 Ryspon: int p = (int) arg[0]10/11 17:35
所以是型别转换的问题吗
我试了呼叫时func((void*)args);
呼叫完转(int)好像都有点怪怪的
不确定是不是要像argc argv那样
函式参数的定义要改才能直接用
void* func(void *arg[]) { }
可是这样呼叫函式前要设定的参数
int args[2] = { p, r }; 我就不知道要怎麽改了
不好意思指标的观念没有很清楚弄得很混乱><
※ 编辑: skyHuan (223.137.198.187), 10/11/2018 18:02:35
※ 编辑: skyHuan (223.137.198.187), 10/11/2018 18:04:21
4F:推 achicn3: int p,q;改intptr_t型态 10/11 18:13
6F:→ joe820730: 在thread里面建一个变数把转型後的指标存起来 10/11 19:42
7F:推 Ryspon: void * 算是一个通用型态的概念,用来传递各种型态的参数 10/11 20:20
8F:→ Ryspon: ,传进去之後要自己转型成需要的 type ,把 arg 转型後 as10/11 20:20
9F:→ Ryspon: sign 给你想要的 type pointer ,就像前几楼回覆的范例那10/11 20:20
10F:→ Ryspon: 样10/11 20:20
谢谢楼上的各位!
我建一个新变数存起来型别转换好後就可以了
感谢万分
※ 编辑: skyHuan (223.137.198.187), 10/11/2018 23:19:33
11F:推 Paravion: 是作业系统的merge sort作业吗 11/01 19:07
12F:推 q79236: Sky葛格 03/13 02:15