我用C语言编写了一个程序,它将启动2个线程(UDP / TCP)。每个线程将发送数据包。
我在两个线程中每5秒发送一次数据包。两个线程将调用如下所示的相同函数:
没有全局变量被修改,共享函数内部仅使用参数。
由于没有共享变量被更新,两个线程调用同一个函数是否安全?这会导致任何不确定的行为吗?
//create message
int getMsg(char * msg, int size)
{
char strMsg[size];
sprintf(strMsg, "%d", 10);
strcat(msg, strMsg);
return EXIT_SUCCESS;
}
// tcp
void send1()
{
while(1)
{
// create message to send
char str[100];
int rVal;
rVal = getMsg(str, 100);
if(rVal != EXIT_FAILURE)
{
// send packet
sendto(fd, strlen(str), 0, dest, sizeof(*dest));
}
usleep(5000000);
}
}
// udp
void send2()
{
while(1)
{
// create message to send
char msg[200];
int rVal;
rVal = getMsg(msg, 200);
if(rVal != EXIT_FAILURE)
{
// send packet
sendto(fd, strlen(str), 0, dest, sizeof(*dest));
}
usleep(5000000);
}
}
答案 0 :(得分:0)
如果函数不是线程安全的,则会发生未定义的行为。
例如,如果它使用一些global data
,则其中包含一些static variables
或接收作为参数指针,以便每个线程的某些数据相同。
因此应删除对静态变量的使用,而对全局数据和公共数据的使用应由某些同步机制(如Criticalsections)进行包装。
回答您的问题,getMsg
函数是最安全的。
答案 1 :(得分:0)
是的,只要函数不包含使用全局或静态变量,就可以安全地通过多个线程调用公共函数。每个线程都会在各自的调用堆栈上创建一个单独的被调用函数副本。