环境: C++、VS2008、MFC、app for Windows XP。我必须在2个线程中访问和修改一个树结构。我的想法是用一个CCriticalSection来保护每个节点,每当节点内部数据(非子节点)被访问时,它就会锁定。我期望有大量的节点(2-300000)。
非常多的临界区会成为问题吗?
我听说Windows有一个问题,大量打开的句柄,这就是为什么我问这个。
我正在开发一个简单的多线程网络爬虫。我使用sqlite数据库来存储将要扫描的threads.The。我只有一个数据库句柄,问题是主线程查询数据库,以便产生新的urls线程正在访问相同的句柄,但主线程也是。
我已经为每个线程定义了临界区,包括主线程。但如果线程也在临界区,主线程仍会继续执行代码。
下面是一些代码:
CreateDb;
InitializeCriticalSection(critical);
index := 0;
repeat
if threads < THREADS_MAX then
begin
EnterCriticalSec
我曾经知道临界区不能用于进程,因为它们不是内核对象。但在现代操作系统中,我看到了两种可以与进程一起使用的实现。
使用TSL实现:
enter region:
TSL REGISTER,LOCK | copy lock to register and set lock to 1
CMP REGISTER,#0 | was lock zero?
JNE enter region | if it was not zero, lock was set, so loop
RET | return to caller; critical region entered
lea
我不确定我是否理解正确。TryEnterCriticalSection只调用一次,它不像EnterCriticalSection那样粘滞?例如,如果我写下这样的代码
if(TryEnterCriticalSection (&cs))
{
//do something that must be synh
LeaveCriticalSection(&cs);
}
else
{
//do other job
}
//go on
如果TryEnterCriticalSection返回false,部分do something that must be synh将永远不会完成,do oth
class test
{
std::mutex m1;
public:
inline static int i{0};
void operator()()
{
m1.lock();
++i;
m1.unlock();
}
};
int main()
{
test t;
std::thread t1{t}; // doesn't work
// std::thread t1{std::ref(t)}; // works
t1.join();
cout
我从我的大学得到了一个关于n进程的临界截面问题的项目。我已经用c编写了两个进程的代码,但我不知道如何让它在n个进程上工作。代码是用C语言编写的,用于linux线程。
下面是两个进程的代码。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int flag[2];
int turn;
const int MAX = 1e9;
int ans = 0;
void lock_init(){
flag[0]=flag[1]=0;
turn = 0;
}
void lock
// locks a critical section, and unlocks it automatically
// when the lock goes out of scope
CAutoLock(CCritSec * plock)
上面的代码来自wxutil.h,它是锁定不同进程的访问,还是仅仅锁定同一进程中的不同线程?
我正在努力学习有关同步的知识,并了解要想正常工作,需要满足3个条件
1)互斥-未损坏任何数据
2)有界等待-线程不会永远什么都不做
3)正在取得进展-系统作为一个整体正在做工作,例如,不仅仅是传递轮到谁了
我不完全理解为什么下面的代码不能工作。根据我的记录,它是互斥的,但不能满足不断进步或有限的等待。为什么?每个线程都可以做一些事情,只要现在线程崩溃了,每个线程都会轮流。以下是共享变量
int turn; // initially turn = 0
turn == i: Pi can enter its critical section
代码是
do {
while (turn != i)