尽快检测变量变化
Detecting variable change as soon as possible
首先,这与作业有关。只需一点提示就足够了。
我要做的是检测变量(信号)何时发生变化并在 1 微秒或更短时间内公布。目前我的进度:
int main(int argc, char **argv)
{
int i;
N = atoi(argv[1]);
if (argc != 2) {
printf("Usage: %s N\n"
" where\n"
" N : number of signals to monitor\n"
, argv[0]);
return (1);
}
// set a timed signal to terminate the program
signal(SIGALRM, exitfunc);
alarm(20); // after 20 sec
// Allocate signal, time-stamp arrays and thread handles
signalArray = (int *) malloc(N*sizeof(int));
timeStamp = (struct timeval *) malloc(N*sizeof(struct timeval));
pthread_t sigGen;
pthread_t *sigDet = (pthread_t*) malloc(N * sizeof(pthread_t));
long *signalid = (long*) malloc(N * sizeof(long));
for (i=0; i<N; i++) {
signalArray[i] = 0;
}
for (i = 0; i < N; i++)
{
signalid[i] = (long) i;
pthread_create (&sigDet[i], NULL, ChangeDetector, (void*) signalid[i]);
}
pthread_create (&sigGen, NULL, SensorSignalReader, NULL);
// wait here until the signal
for (i = 0; i < N; i++)
{
pthread_join (sigDet[i], NULL);
}
return 0;
}
void *SensorSignalReader (void *arg)
{
char buffer[30];
struct timeval tv;
time_t curtime;
srand(time(NULL));
while (1) {
int t = rand() % 10 + 1; // wait up to 1 sec in 10ths
usleep(t*100000);
int r = rand() % N;
signalArray[r] ^= 1;
if (signalArray[r]) {
gettimeofday(&tv, NULL);
timeStamp[r] = tv;
curtime = tv.tv_sec;
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Changed %5d at Time %s%ld\n",r,buffer,tv.tv_usec);
}
}
}
void *ChangeDetector (void *arg)
{
char buffer[30];
struct timeval tv;
time_t curtime;
long n = (long) arg;
while (1) {
while (signalArray[n] == 0) {}
pthread_mutex_lock(&mutex);
gettimeofday(&tv, NULL);
curtime = tv.tv_sec;
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Detcted %5ld at Time %s%ld after %ld.%06ld sec\n", n, buffer,tv.tv_usec,
tv.tv_sec - timeStamp[n].tv_sec,
tv.tv_usec - timeStamp[n].tv_usec);
pthread_mutex_unlock(&mutex);
while (signalArray[n] == 1) {}
}
}
通过这个实现,我的程序可以在 <= 1 us 的时间内检测到最多 3 个信号。当超过 3 时,响应延迟可达几毫秒。那时候我怎么能检测到更多的信号呢?我想知道如何在 CPU 核心中分配线程任务?我读到通过代码管理在每个核心上执行的内容太痛苦了?我会通过这种努力获得一些东西吗?
您的 ChangeDetector()
依赖于标志上的忙等待。问题是你不能有比 CPUs 多的进程同时忙于等待 - 只有你的 ChangeDetector()
进程的一些子集实际上会在任何时候 运行ning及时。
这意味着很多时候,您必须等待正确的 ChangeDetector
线程被调度回 CPU 才能 运行 并注意到标志已更改.
如果你想每个标志都有一个 ChangeDetector
线程,那么你将需要使用一种非忙等待方法,比如 pthread 条件变量(你可以有一个互斥锁/条件变量对旗帜)。不过,我不确定您是否能够通过这种方式获得亚微秒延迟。
如果您真的想坚持使用忙等待方法,您需要将 ChangeDetector
线程的数量限制在少于 CPU 的数量,方法是让每个负责在每个循环中检查多个数组位置的线程。
首先,这与作业有关。只需一点提示就足够了。
我要做的是检测变量(信号)何时发生变化并在 1 微秒或更短时间内公布。目前我的进度:
int main(int argc, char **argv)
{
int i;
N = atoi(argv[1]);
if (argc != 2) {
printf("Usage: %s N\n"
" where\n"
" N : number of signals to monitor\n"
, argv[0]);
return (1);
}
// set a timed signal to terminate the program
signal(SIGALRM, exitfunc);
alarm(20); // after 20 sec
// Allocate signal, time-stamp arrays and thread handles
signalArray = (int *) malloc(N*sizeof(int));
timeStamp = (struct timeval *) malloc(N*sizeof(struct timeval));
pthread_t sigGen;
pthread_t *sigDet = (pthread_t*) malloc(N * sizeof(pthread_t));
long *signalid = (long*) malloc(N * sizeof(long));
for (i=0; i<N; i++) {
signalArray[i] = 0;
}
for (i = 0; i < N; i++)
{
signalid[i] = (long) i;
pthread_create (&sigDet[i], NULL, ChangeDetector, (void*) signalid[i]);
}
pthread_create (&sigGen, NULL, SensorSignalReader, NULL);
// wait here until the signal
for (i = 0; i < N; i++)
{
pthread_join (sigDet[i], NULL);
}
return 0;
}
void *SensorSignalReader (void *arg)
{
char buffer[30];
struct timeval tv;
time_t curtime;
srand(time(NULL));
while (1) {
int t = rand() % 10 + 1; // wait up to 1 sec in 10ths
usleep(t*100000);
int r = rand() % N;
signalArray[r] ^= 1;
if (signalArray[r]) {
gettimeofday(&tv, NULL);
timeStamp[r] = tv;
curtime = tv.tv_sec;
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Changed %5d at Time %s%ld\n",r,buffer,tv.tv_usec);
}
}
}
void *ChangeDetector (void *arg)
{
char buffer[30];
struct timeval tv;
time_t curtime;
long n = (long) arg;
while (1) {
while (signalArray[n] == 0) {}
pthread_mutex_lock(&mutex);
gettimeofday(&tv, NULL);
curtime = tv.tv_sec;
strftime(buffer,30,"%d-%m-%Y %T.",localtime(&curtime));
printf("Detcted %5ld at Time %s%ld after %ld.%06ld sec\n", n, buffer,tv.tv_usec,
tv.tv_sec - timeStamp[n].tv_sec,
tv.tv_usec - timeStamp[n].tv_usec);
pthread_mutex_unlock(&mutex);
while (signalArray[n] == 1) {}
}
}
通过这个实现,我的程序可以在 <= 1 us 的时间内检测到最多 3 个信号。当超过 3 时,响应延迟可达几毫秒。那时候我怎么能检测到更多的信号呢?我想知道如何在 CPU 核心中分配线程任务?我读到通过代码管理在每个核心上执行的内容太痛苦了?我会通过这种努力获得一些东西吗?
您的 ChangeDetector()
依赖于标志上的忙等待。问题是你不能有比 CPUs 多的进程同时忙于等待 - 只有你的 ChangeDetector()
进程的一些子集实际上会在任何时候 运行ning及时。
这意味着很多时候,您必须等待正确的 ChangeDetector
线程被调度回 CPU 才能 运行 并注意到标志已更改.
如果你想每个标志都有一个 ChangeDetector
线程,那么你将需要使用一种非忙等待方法,比如 pthread 条件变量(你可以有一个互斥锁/条件变量对旗帜)。不过,我不确定您是否能够通过这种方式获得亚微秒延迟。
如果您真的想坚持使用忙等待方法,您需要将 ChangeDetector
线程的数量限制在少于 CPU 的数量,方法是让每个负责在每个循环中检查多个数组位置的线程。