Pthread传递参数 charbuff[MAX_SIZE]; int main(){ pthread_t thread[3]; char message1=17;//17=0x11 char-message2=18; char-message3=19; char-message4=20; int iret[3]; int k; 字符消息[]={17,18,19,20}; /*这是有效的 iret[0]=pthread_create(&thread[0]),NULL,write_to_buffer,(void*)&message1); iret[1]=pthread_create(&thread[1],NULL,将_写入_缓冲区,(void*)&message2); iret[2]=pthread_create(&thread[2],NULL,将_写入_缓冲区,(void*)&message3); iret[3]=pthread_create(&thread[3],NULL,将_写入_缓冲区,(void*)&message4); */ /*但事实并非如此 iret[0]=pthread_create(&thread[0],NULL,write_to_buffer,(void*)消息); iret[1]=pthread_create(&thread[1],NULL,将_写入_缓冲区,(void*)(message+1)); iret[2]=pthread_create(&thread[2],NULL,将_写入_缓冲区,(void*)(message+2)); iret[3]=pthread_create(&thread[3],NULL,将_写入_缓冲区,(void*)(message+3)); */ 对于(k=0;k
您的代码中有一些未定义的行为。您声明了大小为3的Pthread传递参数 charbuff[MAX_SIZE]; int main(){ pthread_t thread[3]; char message1=17;//17=0x11 char-message2=18; char-message3=19; char-message4=20; int iret[3]; int k; 字符消息[]={17,18,19,20}; /*这是有效的 iret[0]=pthread_create(&thread[0]),NULL,write_to_buffer,(void*)&message1); iret[1]=pthread_create(&thread[1],NULL,将_写入_缓冲区,(void*)&message2); iret[2]=pthread_create(&thread[2],NULL,将_写入_缓冲区,(void*)&message3); iret[3]=pthread_create(&thread[3],NULL,将_写入_缓冲区,(void*)&message4); */ /*但事实并非如此 iret[0]=pthread_create(&thread[0],NULL,write_to_buffer,(void*)消息); iret[1]=pthread_create(&thread[1],NULL,将_写入_缓冲区,(void*)(message+1)); iret[2]=pthread_create(&thread[2],NULL,将_写入_缓冲区,(void*)(message+2)); iret[3]=pthread_create(&thread[3],NULL,将_写入_缓冲区,(void*)(message+3)); */ 对于(k=0;k,c,pthreads,C,Pthreads,您的代码中有一些未定义的行为。您声明了大小为3的线程和iret数组,但创建了4个线程,从而覆盖了这些数组的边界。这可能会影响程序的结果及其输出,因为这可能会导致您传递的数据被覆盖。首先,不需要使用(void*)typecast,所有指针都可以作为void*传递,而无需强制转换。要继续,代码的实际输出是什么?传递消息时会得到什么(第二种情况)?顺便说一句:有4个线程,但线程数组只有3个长。确定已更正连接,但仍然未传递数组地址properly@oomkiller那么您是否也更正了线程数组?它必须是p
线程和iret
数组,但创建了4个线程,从而覆盖了这些数组的边界。这可能会影响程序的结果及其输出,因为这可能会导致您传递的数据被覆盖。首先,不需要使用(void*)
typecast,所有指针都可以作为void*
传递,而无需强制转换。要继续,代码的实际输出是什么?传递消息时会得到什么(第二种情况)?顺便说一句:有4个线程,但线程数组只有3个长。确定已更正连接,但仍然未传递数组地址properly@oomkiller那么您是否也更正了线程数组?它必须是pthread_t thread[4];而不是pthread_t thread[3];可能您必须更正int-iret[3];还有,任何其他错误都不在发布的代码中。但是数组从0开始,所以总共4@oomkiller是的,当你索引它们时,而不是当你声明它们时。然后你必须告诉编译器实际的大小,在你的例子中是4
。
char buff[MAX_SIZE];
int main() {
pthread_t thread[3];
char message1 = 17; //17 = 0x11
char message2 = 18;
char message3 = 19;
char message4 = 20;
int iret[3];
int k;
char message[] = {17, 18,19,20};
/*THIS IS WORKING
iret[0] = pthread_create( &thread[0], NULL, write_to_buffer, (void*) &message1);
iret[1] = pthread_create( &thread[1], NULL, write_to_buffer, (void*) &message2);
iret[2] = pthread_create( &thread[2], NULL, write_to_buffer, (void*) &message3);
iret[3] = pthread_create( &thread[3], NULL, write_to_buffer, (void*) &message4);
*/
/* BUT THIS IS NOT
iret[0] = pthread_create( &thread[0], NULL, write_to_buffer, (void*) message);
iret[1] = pthread_create( &thread[1], NULL, write_to_buffer, (void*) (message+1));
iret[2] = pthread_create( &thread[2], NULL, write_to_buffer, (void*) (message+2));
iret[3] = pthread_create( &thread[3], NULL, write_to_buffer, (void*) (message+3));
*/
for(k=0;k<=3;k++) {
pthread_join( thread[k], NULL);
}
//rest of main
}
void *write_to_buffer( void *ptr ) {
while(1) {
pthread_mutex_lock(&my_mutex);
char *message;
message = (char *) ptr;
//when passing by array I'm unable to get the value in the message variable
printf("\nMeeee = %#x ", *(char*)ptr);
//REST OF THE FUNCTION //logic to write to buffer
pthread_mutex_unlock(&my_mutex);
//SOME LOGIC I OMMITED HERE
//to return if(indexx >= MAX_SIZE) return(NULL);
}
}