我有一个程序,监测实时的空气波,并将它们解调成有用的数据.该程序运行良好,随着时间的推移,问题很少。我真正感兴趣的唯一问题是对memcpy的调用是否可以以不同的方式处理。
我尝试过使用valgrind,这段代码似乎没有泄漏内存。
static output_buffer o_buffers[MAX_OUTPUT_BUFF_COUNT]; //MAX_OUTPUT_BUFF_COUNT = 100
static int o_buffer_count = 0;
struct output_buffer
{
int16_t buf[MAXIMUM_BUF_LENGTH]; //= 262144
int len;
};
static void rtlsdr_data_callback(unsigned char *buf, uint32_t len, void *ctx)
{
if (do_exit)
return;
rtl_dev *dev_ctx = (rtl_dev *)ctx;
demod_state *d = &dev_ctx->demod;
rotate_90(buf, len);
int16_t buf16[MAXIMUM_BUF_LENGTH];
//normalize the data
for (int i = 0; i < (int)len; i++)
buf16[i] = (int16_t)buf[i] - 127;
//create a new output buffer
output_buffer o;
memcpy(o.buf, buf16, 2 * len);
o.len = len;
if (do_exit)
return;
//notify the demodulation thread
pthread_rwlock_wrlock(&d->rw);
o_buffers[o_buffer_count] = o;
o_buffer_count++;
pthread_rwlock_unlock(&d->rw);
}
static void *demod_thread_fn(void *arg)
{
rtl_dev *ctx = (rtl_dev *)arg;
demod_state *d = &ctx->demod;
int fbuf_cnt = 0;
float fbuf[MAX_DEMOD_BUFFERSIZE];
int16_t *sp;
d->lowpassed[0] = 0;
while (!do_exit)
{
if (do_exit)
{
return 0;
}
if (!o_buffer_count)
{
continue;
}
//copy the buffers and reset the counter.. TODO: make quicker, watch for leaks
pthread_rwlock_wrlock(&d->rw);
int old_buffer_count = o_buffer_count;
output_buffer *old_buffers = (output_buffer *)malloc(sizeof(output_buffer) * MAX_OUTPUT_BUFF_COUNT);
memcpy(old_buffers, o_buffers, sizeof(output_buffer) * MAX_OUTPUT_BUFF_COUNT);
o_buffer_count = 0;
pthread_rwlock_unlock(&d->rw);
for (int i = 0; i < old_buffer_count; i++)
{
output_buffer o = old_buffers[i];
memcpy(d->lowpassed, o.buf, 2 * o.len);
d->lp_len = o.len;
//do work with the data...
}
free(old_buffers);
}
return 0;
}现在实际的程序相当大,所以很难创建一个工作样例。
然而,一些人注意到:
pthread_rwlock_wrlock(&d->rw);正在引用一个pthread_rwlock_t rw;rtlsdr_data_callback。该方法需要尽可能快地退出,以防止数据丢失。demod_thread_fn对性能的影响并不像我们在另一个线程上那样重要,没有对实时电波作出响应,但是块pthread_rwlock_wrlock(&d->rw); to pthread_rwlock_unlock(&d->rw);将因此阻塞rtlsdr_data_callback。发布于 2017-04-18 16:44:29
if。如果do_exit可以在第一次检查和第二次检查之间进行更改,这很重要,那么您就有了一个竞赛条件--在第二次检查之后,它也可能发生变化。再多的检查都不能给你任何保证。o_buffer_count的改变。new和delete,而不是malloc和free。如果不是,那么您应该选择类型为类型为结构类型的类型,或者实际上是struct output_buffer等。https://codereview.stackexchange.com/questions/161070
复制相似问题