这是使用文件系统创建锁的标准方法.例如,visudo使用它:
[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock
Run Code Online (Sandbox Code Playgroud)
1)我很困惑,因为有竞争条件,但Linux使用它
2)有没有更好的方法来锁定shell中的文件?
3)或者我必须使用目录吗?
找到解决方案:man lockfile.
假设进程正在共享内存中创建互斥锁并锁定它并在互斥锁被锁定时转储核心.
现在在另一个过程中,如何检测互斥锁已被锁定但不属于任何进程?
请考虑以下场景:我正在运行我的应用程序,在执行期间,必须运行另一个进程,并且只有在第二个进程完成内部特定初始化之后,我的第一个进程才能继续.例如:
...
// 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)
我看到几个选项:
我很高兴听到你对这个案子的意见.
谢谢!
天真的问题......
我之前读过 - " 只有通过锁定它的线程才能解锁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) 我想知道是否可以同时锁定多个互斥锁,例如:
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 ++ 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.它接缝非常适合我.任何人都可以解释发生了什么!?!
从不同的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)
或者我应该使用chan或sync.Mutex为此?
我理解等待条件变量的线程原子地释放锁并进入睡眠状态,直到被另一个线程的条件信号唤醒(当满足特定条件时).在它醒来之后,它以原子方式重新获得锁定(不知何故神奇地)并根据需要进行更新并解锁关键部分.
如果有人能解释如何在内核和硬件/汇编级别实现这个conditional_wait()过程,那会很棒吗?
锁如何以原子方式释放并重新获得?内核如何确保它?
这里的睡眠究竟意味着什么?这是否意味着上下文切换到另一个进程/线程?
在线程休眠期间,如何通过在内核级别实现的信号唤醒此线程,以及是否为这些机制提供了任何硬件特定支持?
编辑:
似乎"futex"是管理这种等待/信号的人.缩小我的问题:futex系统如何调用等待和通知条件变量是如何实现/在低级别工作?
编译器是否只是检查锁定和解锁语句之间正在修改哪些变量并将它们绑定到互斥锁,以便对它们进行独占访问?
或者mutex.lock()锁定当前范围内可见的所有资源?
我是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)
上面的方法不起作用,看起来一切正常,但是在尝试以后访问数据时 …