あるサーバーでは正確なデータを表示するスレッドで正しく動作している小さなプログラムがありますが、他のサーバーでは重複が表示されます。
次のコードがあります。
// 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
ここで何が間違っていますか?
あるサーバーではスレッド番号と残りの情報が正しく表示されるのに、別のサーバーでは混乱したデータが表示されるのはなぜですか?
私は一日中それを解決しようとしましたが、成功しませんでした。