pthreadsを初めて使用しました。何度か私のプログラムが失敗してしまい、たまにそれが失敗するため、私は問題を抱えています。私はリンクされたリストの作成、リストへの項目の追加、リストからの項目の削除といったいくつかの基本的なタスク(C言語で書かれています)を実行する私のプログラムにいくつかの機能を持っています。それぞれの関数はそれ自身のリストを作成するので、私はそれらがお互いに相互作用するとは思わないので、mutexは必要ありません。とにかく、誰かがアイデアを持っている場合、または「一般的な」初心者の間違いがある場合は、以下のコードは私のコードです。リンクリストによるpthreadセグメンテーションフォールト - beginner
私は各機能を1000回並列に実行しますが、何回かはフォールトを起こしています。私は、これらの3つの機能の組み合わせでしか起こらないことに気付きます。
プロセスはこのように書き: - 並列 での実行スレッド - - スレッド を作成し、各スレッドが倍 の与えられた数のタスクを実行するためのダミー関数を呼び出す - ダミー関数も
I他の関数を呼び出すことこれらの関数のすべてがリンクリストノードの作成/削除と関係しているので、メモリ使用量/割り当てと関係している可能性があると考えます。どうもありがとう。ここで
が作成され、参加している:ここで
pthread_create(&t7, NULL, (void*)&p4, (void*)var);
pthread_create(&t8, NULL, (void*)&p5a, (void*)var);
pthread_create(&t9, NULL, (void*)&p5b, (void*)var);
pthread_join(t7, NULL);
pthread_join(t8, NULL);
pthread_join(t9, NULL);
はダミー関数です:ここでは
void p4(int *nptr){
int n = *nptr;
// Get current time
struct timeval t0, t1;
gettimeofday(&t0,0);
int i = 0;
LIST *list = (LIST*)malloc(sizeof(LIST));
for(i=0;i<n;i++){
f4(list);
deleteList(list);
}
// Get current time and find time elapsed
gettimeofday(&t1,0);
float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;
printf("Successful execution of p4 in %f microseconds.\n", elapsed);
free(list);
}
void p5a(int *nptr){
int n = *nptr;
LIST *list = (LIST*)malloc(sizeof(LIST));
f4(list);
// Get current time
struct timeval t0, t1;
gettimeofday(&t0,0);
int i = 0;
for(i=0;i<n;i++){
f5a(list);
}
// Get current time and find time elapsed
gettimeofday(&t1,0);
float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;
printf("Successful execution of p5a in %f microseconds.\n", elapsed);
}
void p5b(int *nptr){
int n = *nptr;
LIST *list = (LIST*)malloc(sizeof(LIST));
f4(list);
int i = 0;
for(i=0;i<n;i++){
f5a(list);
}
// Get current time
struct timeval t0, t1;
gettimeofday(&t0,0);
for(i=0;i<n;i++){
f5b(list);
}
// Get current time and find time elapsed
gettimeofday(&t1,0);
float elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;
printf("Successful execution of p5b in %f microseconds.\n", elapsed);
}
は、定期的なタスクを実行に使用される機能です:
// FUNCTION: initialize a linked list with pointers and insert a last element
void f4(LIST *L1){
// initialize an empty linked list if L1 = null
if(L1->head == NULL){
NODE *n = (NODE *)malloc(sizeof(NODE));
L1->head = n;
L1->tail = n;
L1->tail->next = NULL;
n->data = 1;
}
// traverse the linked list to the end
NODE *iter = L1->head;
while(iter->next != NULL)
iter = iter->next;
// insert a new 2 element
NODE *new = (NODE *)malloc(sizeof(NODE));
new->data = 2; // arbitrary for testing
new->next = NULL;
iter->next = new;
L1->tail = new;
}
// FUNCTION: add an item to the end of a list (queue)
void f5a(LIST *list){
NODE *new = (NODE *)malloc(sizeof(NODE));
new->data = 999;
new->next = NULL;
list->tail->next = new;
list->tail = new;
}
// FUNCTION: remove an item from the beginning of a list (queue)
void f5b(LIST *list){
NODE *remove = list->head;
list->head = list->head->next;
free(remove);
}
をご確認ください。あなたが記憶を共有しているようには見えません。私はあなたのリスト機能をより良くテストすることに目を向けるでしょう。 – Collin
これは重要ではないように見えるかもしれませんが、予約語をvariabe名として使用しないでください。 'new'キーワードはC++で予約されています。あなたのプログラムはC言語ではなくC言語であることは知っていますが、ただの場合は避けてください。たぶん誰か(例えばあなた)がC++に移植したいと思うかもしれません... – sirgeorge
deleteListコードも投稿できますか? – Jay