C 从多个线程调用相同的函数

C 从多个线程调用相同的函数,c,multithreading,C,Multithreading,我用C编写了一个程序,它将启动两个线程(UDP/TCP)。每个线程将发送数据包 我在两个线程中每5秒发送一次数据包。两个线程将调用相同的函数,如下所示: 没有修改全局变量,只有参数在共享函数中使用 因为没有更新共享变量,所以两个线程调用同一个函数是安全的?这会导致任何未定义的行为吗 //create message int getMsg(char * msg, int size) { char strMsg[size]; sprintf(strMsg, "%d", 10);

我用C编写了一个程序,它将启动两个线程(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); 
    }
}

如果函数不是线程安全的,则可能发生未定义的行为。 例如,如果它使用一些
全局数据
,则内部有一些
静态变量
或作为参数指针接收,以便每个线程的某些数据相同

所以静态变量的使用应该被删除,全局和公共数据的使用应该被一些同步机制包装,比如Criticalsections


回答您的问题,您的
getMsg
函数是安全的。

是的,通过多个线程调用公共函数是安全的,只要该函数不使用全局或静态变量。每个线程在各自的调用堆栈上创建一个单独的被调用函数副本。

除非您正在更改另一个线程将要访问的数据,否则一切都会正常。与多线程无关的一个问题是,您将指向未初始化数组的指针传递到
getMsg()
该函数尝试附加到那些未初始化的字符串。您正在附加一个固定字符串,因此没有理由分配
str
或在
getMsg