有没有哪种STL 行列容器可以支持同时增加和删除 以及读取内容这三种操作的

有没有哪种STL 队列容器可以支持同时增加和删除 以及读取内容这三种操作的
有没有哪种STL 队列容器可以支持同时增加和删除 以及读取内容这三种操作的

------解决方案--------------------
引用:
Quote: 引用:

这是我自己写的代码,所以我很清楚哪儿有删除哪儿增加,删除只有那一个地方在删除,但是增加会有多个地方push_back 所以是不是如果其他地方没有 erase 这样写就没问题恶劣? 

Quote: 引用:

Quote: 引用:

Quote: 引用:

那建议用list,如果能保证不同线程不会同时对单个元素处理,可以不对单个元素加锁
但是增删操作必须对list加锁


你好,是不是只是增加和删除操作才需要加锁。你帮我看看这样写有没有问题


//增加操作
pthread_mutex_lock(&st_csDatabase);
stl_ListString.push_back(lpszSQLQuery);
pthread_mutex_unlock(&st_csDatabase);

//删除操作

list<tstring>::iterator stl_ListIterator = pClass_This->stl_ListString.begin();
for (;stl_ListIterator != pClass_This->stl_ListString.end();)
{
     pthread_mutex_lock(&st_csDatabase);
     stl_ListIterator = pClass_This->stl_ListString.erase(stl_ListIterator);
     pthread_mutex_unlock(&st_csDatabase);
}



增加操作没错,但是删除操作有问题,在开始遍历的时候就需要加锁了,因为其他的线程可能也对这个list进行删除操作,这样你找到的那个要erase的iter可能是错误的


还是有问题,举个例子,比如你队列为空的情况,一个线程删除,一个线程增加,
1.list<tstring>::iterator stl_ListIterator = pClass_This->stl_ListString.begin();
程序运行读取STL的,此时因为队列为空,你的stl_ListIterator 指向stl_ListString.end()

2.线程进行切换,程序开始进行增加的操作
pthread_mutex_lock(&st_csDatabase);
stl_ListString.push_back(lpszSQLQuery);
pthread_mutex_unlock(&st_csDatabase);
程序这个时候的begin变为新加入的节点

3.线程再次切换会删除的操作,此时程序执行到这里
for (;stl_ListIterator != pClass_This->stl_ListString.end();)

如果这个时候STL的end一直都是不变的,那么不会有问题,程序跳过删除操作,但是这个时候如果STL的end在进行push_back后就会变换,那么你的程序会发生未知错误,因为这个时候你的begin指向的是一个未知的地址,当然如果好运的话你那个begin地址刚好被STL拿去放你刚才push_back的那个

我对STL了解不是很深,所以我不知道这个时候程序是否会崩溃,不过你这程序是否会崩溃,完全交给STL,我觉得你在进行读取操作的时候,还是老老实实加锁

std::list的end结点是始终不变的
当然,写代码不能依赖这一点……该保证安全的地方还是得保证,万一哪个库用了奇怪的实现就不好说了
------解决方案--------------------
仅供参考
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef WIN32
    #pragma warning(disable:4996)
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <process.h>
    #include <io.h>
    #define  MYVOID             void
    #define  vsnprintf          _vsnprintf
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  MYVOID             void *
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
    Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
    usleep(ms*1000);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt
------解决方案--------------------
0==pszFmt[0]) return;
    vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);