在我的测试程序中,我启动了两个线程,每个线程只执行以下逻辑:
1) pthread_mutex_lock()
2) sleep(1)
3) pthread_mutex_unlock()
Run Code Online (Sandbox Code Playgroud)
然而,我发现,一段时间后,这两个线程中的一个将()永远阻塞的pthread_mutex_lock上,而其他线程工作正常.这是一种非常奇怪的行为,我认为这可能是一个潜在的严重问题.通过Linux手册,获取pthread_mutex_t时不禁止sleep().所以我的问题是:这是一个真正的问题还是我的代码中有任何错误?
以下是测试程序.在代码中,第一个线程的输出定向到stdout,而第二个线程定向到stderr.所以我们可以检查这两个不同的输出,看看线程是否被阻塞.
我在linux内核(2.6.31)和(2.6.9)上测试过它.两个结果都是一样的.
//======================= Test Program ===========================
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#define THREAD_NUM 2
static int data[THREAD_NUM];
static int sleepFlag = 1;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static void * threadFunc(void *arg)
{
int* idx = (int*) arg;
FILE* fd = NULL;
if (*idx == 0)
fd = stdout;
else
fd = stderr;
while(1) {
fprintf(fd, "\n[%d]Before pthread_mutex_lock is called\n", *idx);
if (pthread_mutex_lock(&mutex) != 0) {
exit(1);
}
fprintf(fd, …Run Code Online (Sandbox Code Playgroud) 我想使用lager作为我的日志实用程序,并且我已按照以下方式对我的项目进行了组织:
proj\
|
|--lager\
| |--src\
| |--ebin\
| |--...
|
|--logserver\
| |--src\
| |--ebin\
| |--rebar.config
| |--...
|
|--rebar
|
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译logserver时,我总是遇到以下错误:
D:\ proj\logserver> ..\rebar编译
==> logserver (compile)
src/logserver_app.erl:none: error in parse transform 'lager_transform': {undef,
[{lager_transform,
parse_transform,
[[{attribute,1,file,
{"src/logserver_app.erl",1}},
...
Run Code Online (Sandbox Code Playgroud)
有人知道原因吗?谢谢!
这些是一些额外的信息:
rebar的配置文件(D:\ proj\logserver\rebar.config):
... {erl_opts,[{parse_transform,lager_transform},debug_info,{d,'TEST'},{i,"include"},{src_dirs,["src"]}]}.
{lib_dirs,["..\lager\ebin"]}....