這是我第一次使用線程,我從一個簡單的程序開始。該程序需要n
參數並創建n-2
線程。事情是我得到了分段錯誤,我不知道爲什麼。使用線程時出現分段錯誤 - c
下面的代碼:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void *
removeBytes (int i, char* argv[])
{
printf ("%d, %s\n", i, argv[i]);
return NULL;
}
int main (int argc, char *argv[])
{
pthread_t threads[argc - 3];
int err;
int i;
int *ptr[argc - 3];
printf ("argc = %d\n", argc);
for (i = 0; i < argc -3; i++)
{
err =
pthread_create (&(threads[i]), NULL,
removeBytes(i+1,&argv[i+1]), NULL);
if (err != 0)
{
printf ("\nCan't create thread: [%d]", i);
}
else
{
printf ("\nThread created successfully\n");
}
}
for (i = 0; i < argc - 3; i++)
{
pthread_join (threads[i], (void **) &(ptr[i]));
printf("pthread_join - thread %d",i);
}
return 0;
}
例子:我的計劃被稱爲mythread
所以當我運行它./mythread f1 f2 f3 f4 f5 f6
輸出是:
argc = 6
1,f2
Thread created successfully
2,f4
Thread created successfully
3, (null)
爲什麼它會採取f2
爲argv[1]
和f4
爲argv[2]
?
UPDATE:
typedef struct{
int i;
char* argv;
}Data;
void* removeBytes(void* arg){
Data* data = (Data*)arg;
printf("%d, %s\n",data->i, data->argv);
free(data);
return NULL;
}
int main(int argc, char** argv){
Data* data;
pthread_t threads[argc-3];
int i;
int err;
for(i=0; i < argc-3;i++){
data = (Data*)malloc(sizeof(Data));
data->i=i+1;
data->argv=argv[i+1];
err = pthread_create(&(threads[i]),NULL,removeBytes,data);
if(err != 0){
printf("\nCan't create thread %d",i);
}
else{
printf("Thread created successfully\n");
}
}
return 0;
}
爲./mythread F1 F2 F3 F4 F5 F6 F7 F8輸出爲:
5× 「線程創建成功」。它不打印我或argvi [i]。
你的第二個程序沒有打印的原因是你刪除了'pthread_join'。您在編輯中呈現的解決方案存在內存泄漏。你可以在堆棧中分配這些'struct'(例如我在我的答案中所做的方式,但也可以使用其他選項)。 – dasblinkenlight