私はカーネルモジュールを書きました。これは、この 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);
データ競合などはありますか?