1

Sorry for the long title, but I think it explains well what I'm interested in. For example C function strtok is not thread safe in worst possible way :) , it uses a global state. So even if it is called on different data it is not thread safe. So my question is are there functions in "C++ minus C" that have same problem. Again I'm not interested in things like "if you write to same file from 10 threads it is undefined behavior". What I'm interested is "if you write to 2 diff files from 2 diff threads (each thread writes to its own file )that is not thread safe."

4

3 に答える 3

3

スレッドセーフは、実際にはC++11でのみカバーされています。C ++ 03は、マルチスレッド動作を指定していません。

C ++ 11では、関連するビットは1.10 / 8です。「特定のライブラリ呼び出しは、別のスレッドによって実行される他のライブラリ呼び出しと同期します。たとえば、アトミックストアリリースは、ストアから値を取得するロード取得と同期します(29.3 )。」特に§17.6.5.9データ競合の回避。

あなたが言及するケースは明らかに許可されていません: "

  1. このセクションでは、データの競合を防ぐために実装が満たす必要のある要件を指定します(1.10)。特に指定がない限り、すべての標準ライブラリ関数は各要件を満たす必要があります。実装により、以下に指定されている以外の場合にデータの競合が防止される場合があります。
  2. C ++標準ライブラリ関数は、オブジェクトがこれを含む関数の引数を介して直接または間接的にアクセスされない限り、現在のスレッド以外のスレッドによってアクセス可能なオブジェクト(1.10)に直接または間接的にアクセスしてはなりません。
  3. C ++標準ライブラリ関数は、これを含む関数のnonconst引数を介してオブジェクトに直接または間接的にアクセスしない限り、現在のスレッド以外のスレッドからアクセスできるオブジェクト(1.10)を直接または間接的に変更してはなりません。
  4. [:これは、たとえば、スレッド間でオブジェクトを明示的に共有しないプログラムでもデータ競合が発生する可能性があるため、実装が同期なしで静的オブジェクトを内部目的で使用できないことを意味します。—エンドノート]

tmpnam上記のテキストに「特に指定がない限り」と記載されている場合、C関数が含まれています。例:(27.9.2 / 2 NULLtmpnamの議論NULL。」

于 2011-09-19T13:58:37.140 に答える
2

C ++標準は、スレッドセーフであることを保証new(または)しません。malloc()それらをスレッドセーフにすることは非常に重要ですが。

ただし、ほとんどのプラットフォームはスレッドセーフをサポートしていますnew

于 2011-09-19T13:30:37.273 に答える
1

実際、C ++は、「読み取り専用スレッドセーフ」と「フルスレッドセーフ」を区別しています。たとえば、すべてのstdコンテナは「読み取り専用」のスレッドセーフであり、いずれかのスレッドがコンテナを変更した場合は安全ではありません。

ただし、共有データにアクセスしない場合、安全でないC++機能を思い出せません。

于 2011-09-19T13:29:59.370 に答える