哈希Table遍历操作
Hash Table traversal operation
我有以下实现的散列 table 指针指向表示活动语音流的结构。
hash_table_t stream_buffers;
struct stream_struct *streamPtr =
(struct streamPtr *) malloc(sizeof(struct stream_struct));
...
case CTRL_MSG_TYPE_STREAM_START_REQ:
(hash_table_insert(stream_buffers, stream_id, streamPtr));
当我从 UDP 套接字接收到语音数据报时,我进行查找并将该数据报插入目标流的本地环形缓冲区。
if (hash_table_search(stream_buffers, _stream_id, (void **) &streamPtr))
{
streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head] = datagramBuff;
memcpy(streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head],
2 * sizeof(uint16_t) + datagramBuff,
streamPtr->framelegnth);
streamPtr->ringBuffer.head =
(streamPtr->ringBuffer.head + streamPtr->framelegnth)
% streamPtr->ringBuffer.size;
if (streamPtr->ringBuffer.filled < streamPtr->ringBuffer.size)
streamPtr->ringBuffer.filled++;
}
现在我想并行处理来自不同流的这些语音帧。为此,我需要遍历哈希 Table 并将所有指向活动流的指针收集到一个公共数组中,该数组将用作 PARALLEL_FOR 循环的参数以进行操作。我当前的 Hash Table 实现没有这样的操作。我该如何实施?
parallel_for
是 c++11,不是 c。你真的在用C吗?
从变量名和语音主语进行猜测,假设CMU的Sphinx项目正在做
并且来自该项目的 hash_table.h 除外
typedef struct hash_entry_s {
const char *key;
size_t len;
void *val;
struct hash_entry_s *next;
} hash_entry_t;
typedef struct {
hash_entry_t *table;
int32 size;
int32 inuse;
int32 nocase;
} hash_table_t;
基于这些结构,需要从hash_table_t
记录里面的hash_entry_t
指针table
开始。
沿着 next
指针的链)从该链的头部开始,直到到达 NULL。
您想要收集的数据可能保存在每个记录的 void
指针 val
中,但我不确定。检查那里是否指向您要查找的数据包组
编辑
我怀疑函数 hash_table_tolist( ... )
做了我刚才描述的事情
我有以下实现的散列 table 指针指向表示活动语音流的结构。
hash_table_t stream_buffers;
struct stream_struct *streamPtr =
(struct streamPtr *) malloc(sizeof(struct stream_struct));
...
case CTRL_MSG_TYPE_STREAM_START_REQ:
(hash_table_insert(stream_buffers, stream_id, streamPtr));
当我从 UDP 套接字接收到语音数据报时,我进行查找并将该数据报插入目标流的本地环形缓冲区。
if (hash_table_search(stream_buffers, _stream_id, (void **) &streamPtr))
{
streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head] = datagramBuff;
memcpy(streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head],
2 * sizeof(uint16_t) + datagramBuff,
streamPtr->framelegnth);
streamPtr->ringBuffer.head =
(streamPtr->ringBuffer.head + streamPtr->framelegnth)
% streamPtr->ringBuffer.size;
if (streamPtr->ringBuffer.filled < streamPtr->ringBuffer.size)
streamPtr->ringBuffer.filled++;
}
现在我想并行处理来自不同流的这些语音帧。为此,我需要遍历哈希 Table 并将所有指向活动流的指针收集到一个公共数组中,该数组将用作 PARALLEL_FOR 循环的参数以进行操作。我当前的 Hash Table 实现没有这样的操作。我该如何实施?
parallel_for
是 c++11,不是 c。你真的在用C吗?
从变量名和语音主语进行猜测,假设CMU的Sphinx项目正在做
并且来自该项目的 hash_table.h 除外
typedef struct hash_entry_s {
const char *key;
size_t len;
void *val;
struct hash_entry_s *next;
} hash_entry_t;
typedef struct {
hash_entry_t *table;
int32 size;
int32 inuse;
int32 nocase;
} hash_table_t;
基于这些结构,需要从hash_table_t
记录里面的hash_entry_t
指针table
开始。
沿着 next
指针的链)从该链的头部开始,直到到达 NULL。
您想要收集的数据可能保存在每个记录的 void
指针 val
中,但我不确定。检查那里是否指向您要查找的数据包组
编辑
我怀疑函数 hash_table_tolist( ... )
做了我刚才描述的事情