小编use*_*933的帖子

为什么在获取pthread_mutex_lock后sleep()会阻塞整个程序?

在我的测试程序中,我启动了两个线程,每个线程只执行以下逻辑:

    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)

unix linux pthreads

4
推荐指数
1
解决办法
4543
查看次数

使用较大的日志框架时,始终得到lager_transform的undef错误

我想使用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)

有人知道原因吗?谢谢!

这些是一些额外的信息:

  • 我正在使用Windows操作系统并使用最新版本的Erlang和rebar和lager.
  • lager本身已经编译好了.我们可以找到D:\ proj\logserver> dir ..\lager\ebin\lager_transform.beam(这会成功)
  • 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"]}....

erlang rebar

4
推荐指数
2
解决办法
3837
查看次数

标签 统计

erlang ×1

linux ×1

pthreads ×1

rebar ×1

unix ×1