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
中获得一些“垃圾”数据,并且您的程序将在执行过程中的某个随机点出现意外行为)。