我们必须在C中实现多线程桶排序算法。我已经简化了代码,它有同样的问题。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int max_threads;
void *bucket_sort( void * );
int main( int argc, char *argv[] )
{
srand( time( NULL ) );
if( argc != 2 )
{
printf( "Wrong arguements\n" );
exit( EXIT_FAILURE );
}
max_threads = ( int ) strtol( argv[1], NULL, 10 );
pthread_t *threads = malloc( sizeof( pthread_t ) * max_threads );
for( int i = 0; i < max_threads; )
{
if( pthread_create( &threads[i], NULL, bucket_sort, &i ) )
exit( EXIT_FAILURE );
i++;
}
for( int i = 0; i < max_threads; ++i )
pthread_join( threads[i], NULL );
}
void *bucket_sort( void *param )
{
int p = *( int * )param;
printf( "%d\n",p );
}
如果我使用./a.out 10运行程序,输出应该是这样的:
0 1 2 3 4 5 6 7 8 9
我知道输出的顺序可能会有所不同,但[0,9]中的所有元素都应该只打印一次。 但输出完全不同:
1234334445
7676543543
这不是我预期的输出。为什么我的程序输出如此奇怪?我能做些什么来获得我期望的行为?
由于 帕特里克
答案 0 :(得分:2)
进行以下更改:
if( pthread_create( &threads[i], NULL, bucket_sort, (void*)i ) )
...
int p = (int)param;
您的代码将指针传递给i
,变量同时发生变化,最终超出范围,这是未定义的行为。传递i
值而不是指针。