C结构的意义

C结构的意义,c,C,在下面的代码中,int-sid=*(int*)args构造的作用是什么 void *thread_p(void *args) { int sid=*(int*)args,i,size=0;***This initialisation in the thread function means what?*** char msg[100]; while(1) { for(i=0;i<100;i++) ms

在下面的代码中,
int-sid=*(int*)args
构造的作用是什么

void *thread_p(void *args)
{
    int sid=*(int*)args,i,size=0;***This initialisation in the thread function means what?***
    char msg[100];

    while(1)
    {
            for(i=0;i<100;i++)
                msg[i]='\0';

            recv(sid,msg,100,0);
            printf("\nClient:%s",msg);
            printf("\nServer:");
            gets(msg);

            size=strlen(msg);
            send(sid,msg,size,0);
            if((strcmp(msg,"exit"))==0)
            {  
                close(sid);
                exit(1);
            }
    }
}
void*线程(void*args)
{
int sid=*(int*)args,i,size=0;***线程函数中的这个初始化意味着什么***
char-msg[100];
而(1)
{

对于(i=0;i 这里,我假设thRead是P的一个pthRead创建开始例程。这样的启动例程是需要接受空指针的,在C++和C++中,它是指向一个非类型内存块的指针。现在,除了一个启动例程之外,pthRead创建也接受一个空指针参数,它传递给启动例程。t由pthread_create的调用方来协调pthread_create的调用与启动例程中的代码。因此,如果给pthread_create的启动例程假定空指针指向(例如)一个整数,那么对pthread_create的调用必须传递一个指向整数的指针作为arg参数以保持同步。这是一种unsaf类型编译器不会帮助您确保这些同步,如果它们不同步,您将得到未定义的行为


thread_p函数假定传递给它的参数实际上指向一个整数。它首先将void指针强制转换为整数指针(即(int*)参数部分),然后取消对指针的引用以获取它所指向的整数(即(int*)参数前面的*)。如果pthread_create的调用方传递了它的thread_p,但未能将int的地址作为arg参数传递,则代码将具有未定义的行为。

这与多线程无关,而是与您使用的实际编程语言有关。这到底是什么意思?也就是说,假设C的右边是evalu被定义为
*((int*)args)
,即首先转换为
int*
,然后取消引用。或者换句话说,sid被分配args指向的int的值。假设args指向存储有意义的int的地址。这意味着您正在读取
sizeof(int)
args
指向的地址中提取字节,并将这些字节写入局部变量
sid
。如果
args
指向的地址未与
int
对齐(即不能被
sizeof(int)
整除)以及您的平台(编译器+硬件)不支持未对齐的加载/存储操作,则会产生运行时错误(立即内存访问冲突,甚至更糟-您将在变量
sid
中获得一些“垃圾”数据,并且您的程序将在执行过程中的某个随机点出现意外行为)。