标签: mutex

普通锁定文件中的竞争条件?

这是使用文件系统创建锁的标准方法.例如,visudo使用它:

[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock
Run Code Online (Sandbox Code Playgroud)

1)我很困惑,因为有竞争条件,但Linux使用它

2)有没有更好的方法来锁定shell中的文件?

3)或者我必须使用目录吗?

找到解决方案:man lockfile.

linux bash shell mutex locking

15
推荐指数
2
解决办法
7562
查看次数

一个用户崩溃时共享内存中的互斥锁?

假设进程正在共享内存中创建互斥锁并锁定它并在互斥锁被锁定时转储核心.

现在在另一个过程中,如何检测互斥锁已被锁定但不属于任何进程?

c c++ linux mutex shared-memory

15
推荐指数
3
解决办法
9918
查看次数

使用进程间同步对象同步2个进程 - Mutex或AutoResetEvent

请考虑以下场景:我正在运行我的应用程序,在执行期间,必须运行另一个进程,并且只有在第二个进程完成内部特定初始化之后,我的第一个进程才能继续.例如:

...
// Process1 code does various initializations here
Process.Start("Process2.exe");
// Wait until Process2 finishes its initialization and only then continue (Process2 doesn't exit)
...
Run Code Online (Sandbox Code Playgroud)

我看到几个选项:

  1. Mutex - Mutex在考虑进程间通信时会自动浮现,但是,我看不到让Process1等待他自己生成的互斥锁的方法.我可以使Process2创建一个互斥锁并等待Process1,直到创建Mutex(使用轮询和Mutex.OpenExisting函数)
  2. AutoResetEvent - 那些对于任务来说是完美的,但是,似乎在.NET下这些不能用于进程间通信.
  3. CreateEvent - 我可以使用P/Invoke并使用Win32 CreateEvent函数.从理论上讲,它可以为我提供我需要的一切.但是,如果可能的话,我宁愿不使用本机函数.
  4. 使用外部文件 - 最简单的方法就是使用一些操作系统外部对象(文件,注册表等).然而,这似乎相当hacky.

我很高兴听到你对这个案子的意见.

谢谢!

.net c# pinvoke synchronization mutex

15
推荐指数
2
解决办法
2万
查看次数

Pthread Mutex锁通过不同的线程解锁

天真的问题......

我之前读过 - " 只有通过锁定它的线程才能解锁MUTEX. "

但是我写了一个程序,其中THREAD1锁定了mutexVar并进入睡眠状态.然后THREAD2可以直接解锁mutexVar做一些操作并返回.

==>我知道每个人都说我为什么这样做?但我的问题是 - 这是MUTEX的正确行为吗?

==>添加示例代码

void *functionC()
{
   pthread_mutex_lock( &mutex1 );
   counter++;
   sleep(10);
   printf("Thread01: Counter value: %d\n",counter);
   pthread_mutex_unlock( &mutex1 );
}

void *functionD()
{
   pthread_mutex_unlock( &mutex1 );
   pthread_mutex_lock( &mutex1 );
   counter=10;
   printf("Counter value: %d\n",counter);
}

int main()
{
   int rc1, rc2;
   pthread_t thread1, thread2;

   if(pthread_mutex_init(&mutex1, NULL))
   printf("Error while using pthread_mutex_init\n");

   if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
   {   
      printf("Thread creation failed: %d\n", rc1);
   }   

   if( (rc2=pthread_create( &thread2, NULL, &functionD, NULL)) …
Run Code Online (Sandbox Code Playgroud)

linux mutex pthreads

15
推荐指数
2
解决办法
2万
查看次数

锁定多个互斥锁

我想知道是否可以同时锁定多个互斥锁,例如:

 Mutex1.Lock();
 {
     Mutex2.Lock();
     {
          // Code locked by mutex 1 and 2.
     }
     Mutex2.Unlock();

     // Code locked by mutex 1.
 }
 Mutex1.Unlock();
Run Code Online (Sandbox Code Playgroud)

这对某些情况非常有用.谢谢.

c++ multithreading mutex

15
推荐指数
3
解决办法
1万
查看次数

在多个线程中使用std :: cout

我在c ++ 11中编写了一个用于测试Thread的简单程序,但是std::cout没有按照我的预期工作.

class Printer
{
public:
    void exec()
    {
        mutex m;
        m.lock();
        cout<<"Hello  "<<this_thread::get_id()<<endl;
        chrono::milliseconds duration( 100 );
        this_thread::sleep_for( duration );
        m.unlock();

    }
};

int main()
{
    Printer printer;

    thread firstThread([&printer](){
        while(1)
            printer.exec();

    });
    thread secondThread([&printer](){
        while(1)
            printer.exec();
    });

    firstThread.join();
    secondThread.join();     
}
Run Code Online (Sandbox Code Playgroud)

一些结果:

Hello 11376
Hello 16076
Hello 16076
Hello Hello 11376
16076
Hello 11376
,....
Run Code Online (Sandbox Code Playgroud)

我使用互斥锁来锁定线程,所以我无法理解为什么两个线程同时执行std::cout.它接缝非常适合我.任何人都可以解释发生了什么!?!

c++ multithreading mutex c++11 stdthread

15
推荐指数
3
解决办法
2万
查看次数

在go中访问struct的不同成员是否安全?

从不同的goroutines访问不同的struct成员是否安全?

我明白,在没有同步的情况下写入同一个变量是很糟糕的:

package main

type Apple struct {
    color string
    size  uint
}

func main() {
    apple := &Apple{}
    go func() {
        apple.color = "red"
    }()
    go func() {
        apple.color = "green"
    }()
}
Run Code Online (Sandbox Code Playgroud)

但是你可以在没有任何同步的情况下写入不同的struct成员吗?

package main

type Apple struct {
    color string
    size  uint
}

func main() {
    apple := &Apple{}
    go func() {
        apple.color = "red"
    }()
    go func() {
        apple.size = 42
    }()
}
Run Code Online (Sandbox Code Playgroud)

或者我应该使用chansync.Mutex为此?

mutex sync go

15
推荐指数
1
解决办法
3040
查看次数

如何在内核和硬件/汇编级别实现conditional_wait()?

我理解等待条件变量的线程原子地释放锁并进入睡眠状态,直到被另一个线程的条件信号唤醒(当满足特定条件时).在它醒来之后,它以原子方式重新获得锁定(不知何故神奇地)并根据需要进行更新并解锁关键部分.

如果有人能解释如何在内核和硬件/汇编级别实现这个conditional_wait()过程,那会很棒吗?

锁如何以原子方式释放并重新获得?内核如何确保它?

这里的睡眠究竟意味着什么?这是否意味着上下文切换到另一个进程/线程?

在线程休眠期间,如何通过在内核级别实现的信号唤醒线程,以及是否为这些机制提供了任何硬件特定支持?

编辑:

似乎"futex"是管理这种等待/信号的人.缩小我的问题:futex系统如何调用等待和通知条件变量是如何实现/在低级别工作?

c multithreading synchronization mutex linux-kernel

15
推荐指数
1
解决办法
2355
查看次数

C++ std :: mutex如何绑定到资源?

编译器是否只是检查锁定和解锁语句之间正在修改哪些变量并将它们绑定到互斥锁,以便对它们进行独占访问?

或者mutex.lock()锁定当前范围内可见的所有资源?

c++ concurrency mutex locking

15
推荐指数
3
解决办法
1840
查看次数

在for循环中使用指针 - Golang

我是golang的新手,并且很难理解为什么我的代码中有一个错误而不是另一个状态.我已经有一段时间了,因为我已经覆盖了指针,所以我可能生锈了!

基本上我有一个存储库结构,我用来将一个对象存储在内存中,它有一个Store函数.

type chartsRepository struct {
    mtx    sync.RWMutex
    charts map[ChartName]*Chart
}

func (r *chartsRepository) Store(c *Chart) error {
    r.mtx.Lock()
    defer r.mtx.Unlock()
    r.charts[c.Name] = c
    return nil
}
Run Code Online (Sandbox Code Playgroud)

所以它只是将RW互斥锁置于其上并将指针添加到地图,由标识符引用.

然后我有一个函数,它将基本上遍历这些对象的一部分,将它们全部存储在存储库中.

type service struct {
    charts Repository
}

func (svc *service) StoreCharts(arr []Chart) error {
    hasError := false
    for _, chart := range arr {
        err := svc.repo.Store(&chart)
        // ... error handling
    }
    if hasError {
        // ... Deals with the error object
        return me
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,看起来一切正常,但是在尝试以后访问数据时 …

pointers mutex for-loop go

15
推荐指数
2
解决办法
4704
查看次数