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

时间:2018-08-12 18:00:12

标签: c multithreading

我用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); 
    }
}

2 个答案:

答案 0 :(得分:0)

如果函数不是线程安全的,则会发生未定义的行为。 例如,如果它使用一些global data,则其中包含一些static variables 或接收作为参数指针,以便每个线程的某些数据相同。

因此应删除对静态变量的使用,而对全局数据和公共数据的使用应由某些同步机制(如Criticalsections)进行包装。

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

答案 1 :(得分:0)

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