我写了一个内核模块,它是一个类似于这个 Link的字符设备驱动程序。驱动程序的内部结构如下:
struct {
str[500];
}channelData;
static channelData chData[4];
所以我有一个使用这个驱动程序的多线程应用程序,我目前以下列方式使用这个驱动程序:
typedef struct
{
int channelId;
int len;
char arg[100];
} driverArgs;
class DevDrv{
static void STR_READ(int channelId, char *data);
static void STR_SEND(int channelId, char *data,int len);
};
void DevDrv::STR_READ(int channelId, char *data)
{
driverArgs arg= {-1,0, {0}};
arg.channelId = channelId;
ioctl(mfilehandler,IOCTL_STR_READ,&arg);
memcpy(data,arg.arg,arg.len)
}
void DevDrv::STR_SEND(int channelId, char *data,int len)
{
driverArgs arg= {-1,0, {0}};
arg.channelId = channelId;
arg.len=len;
memcpy(arg.arg,data,len);
ioctl(mfilehandler,IOCTL_STR_SEND,&arg);
}
所以,问题是我的应用程序中的 4 个线程是否调用这些函数来读取或写入它们自己的 ChannelId,像这样读取或写入驱动程序:
thread1:
DevDrv::STR_READ(0,&localdst);
thread2:
DevDrv::STR_READ(1,&localdst);
thread3:
DevDrv::STR_READ(2,&localdst);
thread4:
DevDrv::STR_READ(3,&localdst);
是否有数据竞赛或类似的事情发生?