【发布时间】:2017-01-31 09:32:56
【问题描述】:
我正在创建一个简单的 kdb+ 共享库,它在单独的线程上生成值并在数据准备好时执行回调函数。应用程序正在新线程中将数据写入文件描述符,并在主事件循环中从中读取。尝试锁定和解锁互斥锁时,应用程序似乎出现了段错误。
如果我在循环中引入一个小睡眠,段错误似乎消失了。这表明pthread_mutex_lock 调用不会阻塞线程,直到我预期的那样获得锁。
#include <k.h>
#include <pthread.h>
#include <time.h>
#define PIPE_CAPACITY 65536
static int fd;
static pthread_t thread;
static pthread_mutex_t lock;
K callback(int d)
{
K data;
// Aquire mutex lock and read from fd
pthread_mutex_lock(&lock);
read(d, &data, PIPE_CAPACITY);
pthread_mutex_unlock(&lock);
// kdb+ callback
k(0, (char *)"callback", r1(data), (K)0);
return (K)0;
}
void* loop()
{
while (1) {
struct timespec ts;
struct tm *time;
// Get seconds and nanoseconds since epoch
clock_gettime(CLOCK_REALTIME, &ts);
// Adjust for kdb+
time = gmtime(&ts.tv_sec);
time->tm_sec = 0;
time->tm_min = 0;
time->tm_hour = 0;
ts.tv_sec -= mktime(time); // Subtract seconds between epoch and midnight
// Create kdb+ timestamp
K data = ktj(-KN, ts.tv_sec * 1000000000 + ts.tv_nsec);
// Aquire mutex lock and write to fd
pthread_mutex_lock(&lock);
write(fd, &data, sizeof(K));
pthread_mutex_unlock(&lock);
}
}
K init()
{
// Initialize mutex
pthread_mutex_init(&lock, NULL);
// Create file descriptor
fd = eventfd(0, 0);
// Register callback
sd1(fd, callback);
// Launch thread
pthread_create(&thread, NULL, loop, NULL);
}
【问题讨论】:
-
不相关,但您确实应该避免使用一个字母的类型名称,例如
K。 -
能否提供“main”功能?初始化是否在线程创建前生效?
-
@MichaelWalz 这取决于我必须使用的 API,而不是我个人的选择 - 包含在 k.h
-
@Emisilve86 这是一个共享库,没有主函数。入口点将是
init。 -
@AnthonyGraham Fyi,
gmtime不是线程安全的。如果在您的平台上提供,您应该使用gmtime_r(这很有可能,因为您正在使用线程)。或者gmtime_s如果使用符合 C11 的工具链。
标签: c multithreading pthreads mutex kdb