为什么typedef不能用于pthread?

时间:2016-10-16 00:31:26

标签: c multithreading pthreads

我正在尝试通过函数发送typedef。但是,似乎我不能。

#define MAX 2
typedef struct
{
    unsigned long myPid;
    unsigned long parentPid;
    unsigned long myTid;
} myProperties;

void* funcproperties(void* arg);
void createthread(myProperties (*properties)[MAX]);

这就是我的typedef的定义方式。

void* funcproperties(void* arg)
{
    myProperties *properties=(myProperties*) arg;   
    properties->myPid=getpid();
    properties->parentPid=getppid();    
    properties->myTid=syscall(SYS_gettid);
    return NULL;
}

如果我给properties[0].myPid=getpid()提供价值,我就不会有问题。但是,当我发送typedef将开始的位置的地址(0或1)时,它不会。我想知道为什么?也许pthread不支持它?

void createthread(myProperties (*properties)[MAX])
{
    pthread_t tids[MAX];

    for (int i = 0; i < MAX; i++) {
        if ((errno = pthread_create(&tids[i], NULL, funcproperties, properties[i])) != 0)
            ERROR(C_ERRO_PTHREAD_CREATE, "pthread_create() failed!");
    }
    for (int i = 0; i < MAX; i++)
        printf("\n PID:%lu DAD: %lu TID: %lu", properties[i]->myPid, properties[i]->parentPid ,properties[i]->myTid);
}

这是我得到的结果(我强迫pid定义。但是,如果我没有弄错,我会得到随机值。)

     PID:0 DAD: 3076323888 TID: 134519979
     PID:612976384 DAD: 3077911516 TID: 3220212208
     PID:0 DAD: 3076323888 TID: 134519979
     PID:612976384 DAD: 3077911516 TID: 3220212208
     PID:0 DAD: 3076323888 TID: 134519979
     PID:612976384 DAD: 3077911516 TID: 3220212208
     I 9292 did my job now make yourself served

PS:我也在使用流程。

1 个答案:

答案 0 :(得分:0)

必须确保一个线程无法访问对象,而另一个线程可能正在修改它。你还没有这样做,所以结果是不可预测的。

一种解决方案是在查看所有线程之前调用pthread_join