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

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

您的代码中有一些未定义的行为。您声明了大小为3的
线程和
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);        
    }   
}