0

あるサーバーでは正確なデータを表示するスレッドで正しく動作している小さなプログラムがありますが、他のサーバーでは重複が表示されます。

次のコードがあります。

// Structure
struct words_list {
    char myword[20];
    struct words_list * next;
};
struct myrepl_list {
    char myrepl[20];
    struct myrepl_list * next;
};

struct arg_struct {
    char *word;
    char *repl;
    int t;
};


int max_thread = 1;
// Mutex variables
pthread_mutex_t repl_list;
pthread_mutex_t thrd_list;

struct words_list * first_word = NULL;
struct myrepl_list * first_repl = NULL;

/*
do_process()
*/
void* do_process(void *arguments)
{
    int *res = malloc(sizeof(int));
    struct arg_struct *args = arguments;
    char *word, *repl;
    int t;
    pthread_mutex_lock(&thrd_list);
    word = args->word;
    repl = args->repl;
    t = args->t;
    pthread_mutex_unlock(&thrd_list);
    fprintf(stderr,"(%d) WORD: %s REPL: %s\n",t,word,repl);

//test example of return
    if (strstr(word, repl))
        *res = 1;
    else
        *res = 0;
//
    return res;
}


int main ()
{
    int ex = 0, i = 0;
    char myword[20];
    char myrepl[20];
    struct words_list * curr_word = first_word;
    struct myrepl_list * curr_repl = first_repl;
    struct arg_struct args;
    pthread_t thread_id[MAX_THREADS];

    while(ex == 0)
    {
        int ret = -1;
        for(i = 0 ; i < max_thread; i++)
        {
            // Get current word and myrepl
            pthread_mutex_lock(&repl_list);
            strncpy(myword,curr_word->myword,sizeof(myword) - 1);
            strncpy(myrepl,curr_repl->myrepl,sizeof(myrepl) - 1);
            pthread_mutex_unlock(&repl_list);
            args.myword = myword;
            args.myrepl = myrepl;
            args.t = i;

            //start threads
            if(pthread_create(&thread_id[i],NULL,&do_process,&args) != 0)
            {
                i--;
                fprintf(stderr,RED "\nError in creating thread\n" NONE);
            }
            else
            {
                pthread_mutex_lock(&repl_list);
                if(curr_repl->next == NULL)
                {
                    if(curr_word->next != NULL)
                    {
                        curr_word = curr_word->next;
                        curr_repl = first_repl;
                    }
                    else
                    {
                        ex = 1;
                        break;
                    }
                }
                else
                    curr_repl = curr_repl->next;
                pthread_mutex_unlock(&repl_list);
            }
        }

        for(i = 0 ; i < max_thread; i++)
        {
            void *join_result;
            if(pthread_join(thread_id[i],&join_result) != 0)
                fprintf(stderr,RED "\nError in joining thread\n" NONE);
            else
            {
                ret = *(int *)join_result;
                free(join_result);
                if(ret == 1)
                {
                    ex = 1;
                    break;
                }
                else
                {
                    //code missing
                }
            }
        }
    }//end while
}

これは、1 つのサーバーでこの出力を示しています。

(0) WORD: test1 REPL: bla0
(1) WORD: test1 REPL: bla1
(2) WORD: test1 REPL: bla2
(0) WORD: test1 REPL: bla3
(1) WORD: test1 REPL: bla4
(2) WORD: test1 REPL: bla5
(0) WORD: test1 REPL: bla6
(1) WORD: test1 REPL: bla7
(2) WORD: test1 REPL: bla8
(0) WORD: test1 REPL: bla9
(1) WORD: test1 REPL: bla10
(2) WORD: test2 REPL: bla0
(0) WORD: test2 REPL: bla1
(1) WORD: test2 REPL: bla2
(2) WORD: test2 REPL: bla3
(0) WORD: test2 REPL: bla4
(1) WORD: test2 REPL: bla5
(2) WORD: test2 REPL: bla6

そして別のサーバーではこれを示しています:

(2) WORD: test1 REPL: bla2
(2) WORD: test1 REPL: bla2
(2) WORD: test1 REPL: bla2
(1) WORD: test1 REPL: bla1
(2) WORD: test1 REPL: bla4
(2) WORD: test1 REPL: bla4
(1) WORD: test1 REPL: bla6
(2) WORD: test1 REPL: bla7
(2) WORD: test1 REPL: bla7
(1) WORD: test1 REPL: bla9
(2) WORD: test1 REPL: bla10
(2) WORD: test2 REPL: bla10
(1) WORD: test2 REPL: bla1
(2) WORD: test2 REPL: bla2
(2) WORD: test2 REPL: bla2
(1) WORD: test2 REPL: bla4
(2) WORD: test2 REPL: bla3
(2) WORD: test2 REPL: bla3

そして、おそらくスレッドループ内のブレークのために、最後にこれも取得します:

Error in joining thread

Error in joining thread

Error in joining thread

Error in joining thread

ここで何が間違っていますか?

あるサーバーではスレッド番号と残りの情報が正しく表示されるのに、別のサーバーでは混乱したデータが表示されるのはなぜですか?

私は一日中それを解決しようとしましたが、成功しませんでした。

4

1 に答える 1

1

この行で

strncpy(myword,curr_word->myword,sizeof(myword) - 1);

プログラムはそのまま逆参照NULLcurr_wordますNULL。これは反抗的な行動を誘発するので、この後は何でも起こる可能性があります。


また、必ずしも宛先文字配列に -termination をstrncpy()追加するとは限らないことに注意してください。0詳細man strncpyについては、 を参照してください

于 2013-08-24T17:58:59.873 に答える